package admin
import (
"maps"
"reflect"
"fmt"
"github.com/gofiber/fiber/v2"
"MY/webapp/data"
"MY/webapp/api"
. "MY/webapp/common"
)
func GetApiTableIndex ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
var tables [ ] string
for k := range maps . Keys ( data . Models ( ) ) {
tables = append ( tables , k )
}
return c . JSON ( tables )
}
func GetApiSelectAll ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
if table == "" { return c . Redirect ( "/admin/table/" ) }
type_is := data . Models ( ) [ table ]
page := c . QueryInt ( "page" , 0 )
if page < 0 { page = 0 }
search := c . Query ( "search" , "" )
var result [ ] any
if search == "" {
result , err = SelectTable ( table , type_is , 20 , uint64 ( page ) ) ;
if err != nil { return IfErrNil ( err , c ) }
} else {
// NOTE: need a 404 here when there's no result? or empty list?
result , err = SearchTable ( search , table , type_is , 20 , uint64 ( page ) ) ;
if err != nil { return IfErrNil ( err , c ) }
}
return c . JSON ( result )
}
func GetPageSelectAll ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
return c . Render ( "admin/table/contents" , fiber . Map { "Table" : c . Params ( "table" ) } )
}
func GetApiSelectOne ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
id , err := c . ParamsInt ( "id" , - 1 )
if err != nil || id < 0 { return IfErrNil ( err , c ) }
type_is := data . Models ( ) [ table ]
result , err := Get ( table , type_is , int64 ( id ) )
if err != nil { return IfErrNil ( err , c ) }
return c . JSON ( result . Interface ( ) )
}
func GetPageSelectOne ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
id , err := c . ParamsInt ( "id" , - 1 )
if err != nil || id < 0 { return IfErrNil ( err , c ) }
return c . Render ( "admin/table/view" , fiber . Map {
"Table" : table ,
"Id" : id ,
} )
}
func PostApiUpdate ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
typeOf := data . Models ( ) [ table ]
obj , err := ReflectOnPost ( typeOf , c )
if err != nil { return IfErrNil ( err , c ) }
err = Update ( table , obj . Elem ( ) )
if err != nil { return IfErrNil ( err , c ) }
return c . RedirectBack ( "/admin/table/" , 303 )
}
func GetPageInsert ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
return c . Render ( "admin/table/new" , fiber . Map { "Table" : table } )
}
func GetApiInsert ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
typeOf := data . Models ( ) [ table ]
result := reflect . New ( typeOf )
return c . JSON ( result . Interface ( ) )
}
func PostApiInsert ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
typeOf := data . Models ( ) [ table ]
obj , err := ReflectOnPost ( typeOf , c )
if err != nil { return IfErrNil ( err , c ) }
id , _ , err := Insert ( table , obj . Elem ( ) )
if err != nil { return IfErrNil ( err , c ) }
return c . Redirect ( fmt . Sprintf ( "/admin/table/%s/%d/" , table , id ) , 303 )
}
func DeleteApi ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
table := c . Params ( "table" )
id , err := c . ParamsInt ( "id" , - 1 )
if err != nil || id < 0 { return IfErrNil ( err , c ) }
err = Delete ( table , int64 ( id ) )
if err != nil { return IfErrNil ( err , c ) }
return c . JSON ( fiber . Map { } )
}
func GetPageAdminIndex ( c * fiber . Ctx ) error {
_ , err := api . CheckAuthed ( c , true )
if err != nil { return c . Redirect ( "/" ) }
return c . Render ( "admin/table/index" , fiber . Map { } )
}
func Setup ( app * fiber . App ) {
app . Get ( "/admin/table/" , GetPageAdminIndex )
app . Get ( "/admin/table/:table/" , GetPageSelectAll )
app . Get ( "/admin/new/table/:table/" , GetPageInsert )
app . Get ( "/admin/table/:table/:id/" , GetPageSelectOne )
app . Get ( "/api/admin/table" , GetApiTableIndex )
app . Get ( "/api/admin/table/:table" , GetApiSelectAll )
app . Get ( "/api/admin/new/table/:table" , GetApiInsert )
app . Post ( "/api/admin/new/table/:table" , PostApiInsert )
app . Get ( "/api/admin/table/:table/:id" , GetApiSelectOne )
app . Post ( "/api/admin/table/:table/:id" , PostApiUpdate )
}