package api
import (
"log"
"time"
"github.com/gofiber/fiber/v2"
_ "github.com/mattn/go-sqlite3"
sq "github.com/Masterminds/squirrel"
"github.com/gofiber/fiber/v2/middleware/session"
"zedshaw.games/webapp/data"
. "zedshaw.games/webapp/common"
)
var STORE * session . Store
func GetApiLogout ( c * fiber . Ctx ) error {
err := LogoutUser ( c )
if err != nil { return IfErrNil ( err , c ) }
return c . Redirect ( "/" )
}
func GetApiFeed ( c * fiber . Ctx ) error {
sql , args , err := sq . Select ( "*" ) . From ( "message" ) .
Where ( sq . Eq { "user_id" : c . Params ( "user_id" ) } ) . ToSql ( )
if err != nil { return IfErrNil ( err , c ) }
err = data . SelectJson [ data . Message ] ( c , err , sql , args ... )
return IfErrNil ( err , c )
}
func GetApiMessage ( c * fiber . Ctx ) error {
sql , args , err := sq . Select ( "*" ) . From ( "message" ) .
Where ( sq . Eq { "id" : c . Params ( "id" ) } ) . ToSql ( )
if err != nil { return IfErrNil ( err , c ) }
err = data . GetJson [ data . Message ] ( c , err , sql , args ... )
return IfErrNil ( err , c )
}
func GetApiReplies ( c * fiber . Ctx ) error {
message_id := c . Params ( "message_id" )
sql , args , err := sq . Select ( "*" ) . From ( "message" ) .
Where ( sq . Eq { "replying_to" : message_id } ) . ToSql ( )
log . Println ( "SQL" , sql , args ) ;
if err != nil { return IfErrNil ( err , c ) }
err = data . SelectJson [ data . Message ] ( c , err , sql , args ... )
return IfErrNil ( err , c )
}
func PostApiRegister ( c * fiber . Ctx ) error {
user , err := ReceivePost [ data . User ] ( c )
if err != nil { return IfErrNil ( err , c ) }
err = SetUserPassword ( user )
if err != nil { return IfErrNil ( err , c ) }
sql , args , err := sq . Insert ( "user" ) .
Columns ( "username" , "email" , "password" ) .
Values ( user . Username , user . Email , user . Password ) . ToSql ( )
err = data . Exec ( err , sql , args ... )
if err != nil { return IfErrNil ( err , c ) }
return c . Redirect ( "/login/" )
}
func PostApiLogin ( c * fiber . Ctx ) error {
var user data . User
login , err := ReceivePost [ data . Login ] ( c )
if ( err != nil ) { return IfErrNil ( err , c ) }
pass_good , err := LoginUser ( & user , login )
if err != nil { return IfErrNil ( err , c ) }
if pass_good {
sess , err := STORE . Get ( c )
if err != nil { return IfErrNil ( err , c ) }
// BUG: THIS IS A BIG NO NO, just for getting going
sess . Set ( "authenticated" , true )
sess . Set ( "admin" , IsAdmin ( & user ) )
err = sess . Save ( )
if err != nil { return IfErrNil ( err , c ) }
return c . Redirect ( "/" )
} else {
return c . Redirect ( "/login/" )
}
}
func Setup ( app * fiber . App ) {
STORE = session . New ( )
app . Static ( "/" , "./public" , fiber . Static {
Compress : false ,
CacheDuration : 1 * time . Nanosecond ,
} )
app . Get ( "/api/logout" , GetApiLogout )
app . Post ( "/api/login" , PostApiLogin )
app . Post ( "/api/register" , PostApiRegister )
app . Get ( "/api/feed/:user_id" , GetApiFeed )
app . Get ( "/api/message/:id" , GetApiMessage )
app . Get ( "/api/replies/:message_id" , GetApiReplies )
app . Get ( "/feed/" , Page ( "feed" ) )
app . Get ( "/post/view/:id/" , Page ( "post/view" ) )
app . Get ( "/post/new/" , Page ( "post/new" ) )
app . Get ( "/settings/" , Page ( "settings" ) )
app . Get ( "/u/:user_id" , Page ( "profile" ) )
}
func Shutdown ( ) {
log . Println ( "Shutting down controllers..." )
}