package main import ( "fmt" "log" "net/http" "os" "github.com/joho/godotenv" "github.com/uptrace/bun/extra/bundebug" _ "github.com/lib/pq" "fr.latosa-escrima/api" "fr.latosa-escrima/api/blogs" "fr.latosa-escrima/api/events" "fr.latosa-escrima/api/media" "fr.latosa-escrima/api/permissions" "fr.latosa-escrima/api/roles" "fr.latosa-escrima/api/shortcodes" "fr.latosa-escrima/api/users" "fr.latosa-escrima/core" "github.com/gorilla/csrf" ) var CORS_AllowOrigin string func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "

Hello, World!

") } func main() { err := godotenv.Load() if err != nil { log.Fatalf("Error loading .env file: %v", err) } environ := os.Getenv("ENVIRONMENT") port := os.Getenv("BACKEND_DOCKER_PORT") hostname := os.Getenv("DATABASE_HOSTNAME") postgres_port := os.Getenv("POSTGRES_DOCKER_PORT") if environ == "DEV" { port = os.Getenv("BACKEND_PORT") hostname = "localhost" postgres_port = os.Getenv("POSTGRES_PORT") } dsn := core.DSN{ Hostname: hostname, Port: postgres_port, DBName: os.Getenv("POSTGRES_DB"), User: os.Getenv("POSTGRES_USER"), Password: os.Getenv("POSTGRES_PASSWORD"), } fmt.Println(dsn.ToString()) core.DB, err = core.InitDatabase(dsn) if err != nil { log.Fatal(err) } core.DB.AddQueryHook(bundebug.NewQueryHook(bundebug.WithVerbose(true))) defer core.DB.Close() CSRFMiddleware := csrf.Protect( core.CSRF_KEY, csrf.Secure(environ != "DEV"), csrf.HttpOnly(true), ) mux := http.NewServeMux() core.HandleRoutes(mux, map[string]core.Handler{ "/": { Handler: handler, Middlewares: []core.Middleware{api.Methods("get")}}, "/users/login": { Handler: users.HandleLogin, Middlewares: []core.Middleware{api.Methods("POST")}}, "/users/me": { Handler: users.HandleMe, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}}, "/users": { Handler: users.HandleUsers, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}}, "/users/new": { Handler: users.HandleNew, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}}, "/users/{user_uuid}": { Handler: users.HandleUser, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}}, "/users/{user_uuid}/delete": { Handler: users.HandleDelete, Middlewares: []core.Middleware{api.Methods("DELETE"), api.AuthJWT}}, "/users/{user_uuid}/update": { Handler: users.HandleUpdate, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}}, "/users/{user_uuid}/roles": { Handler: users.HandleRoles, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}}, "/users/{user_uuid}/roles/{role_id}/add": { Handler: users.HandleAddRole, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}}, "/users/{user_uuid}/roles/{role_id}/remove": { Handler: users.HandleRemoveRole, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}}, "/events": { Handler: events.HandleEvents, Middlewares: []core.Middleware{api.Methods("GET")}}, "/events/new": { Handler: events.HandleNew, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}}, "/events/{event_uuid}": { Handler: events.HandleEvent, Middlewares: []core.Middleware{api.Methods("GET")}}, "/events/{event_uuid}/delete": { Handler: events.HandleDelete, Middlewares: []core.Middleware{api.Methods("DELETE"), api.AuthJWT}}, "/events/{event_uuid}/update": { Handler: events.HandleUpdate, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}}, "/blogs/new": { Handler: blogs.HandleNew, Middlewares: []core.Middleware{api.Methods(("POST")), api.AuthJWT}}, "/blogs/{uuid}": { Handler: blogs.HandleBlog, Middlewares: []core.Middleware{api.Methods("GET")}}, "/media/upload": { Handler: media.HandleUpload, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}}, "/media/verify": { Handler: media.HandleVerify, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}, }, // Paginated media response "/media/": { Handler: media.HandleMedia, Middlewares: []core.Middleware{api.Methods("GET")}, }, // Unique element "/media/{media_uuid}": { Handler: media.HandleMediaDetails, Middlewares: []core.Middleware{api.Methods("GET")}, }, // Get the image, video, GIF etc. "/media/{media_uuid}/file": { Handler: media.HandleMediaFile, Middlewares: []core.Middleware{api.Methods("GET")}, }, // "/media/{media_uuid}/update": { // Handler: api.HandleGetMediaFile, // Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}, // }, "/media/{media_uuid}/delete": { Handler: media.HandleDelete, Middlewares: []core.Middleware{api.Methods("DELETE"), api.AuthJWT}, }, "/shortcodes/new": { Handler: shortcodes.HandleNew, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}, }, "/shortcodes/": { Handler: shortcodes.HandleShortcodes, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/shortcodes/{shortcode}": { Handler: shortcodes.HandleShortcode, Middlewares: []core.Middleware{api.Methods("GET")}, }, "/shortcodes/{shortcode}/delete": { Handler: shortcodes.HandleDelete, Middlewares: []core.Middleware{api.Methods("DELETE"), api.AuthJWT}, }, "/shortcodes/{shortcode}/update": { Handler: shortcodes.HandleUpdate, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}, }, "/roles/": { Handler: roles.HandleRoles, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/roles/new": { Handler: roles.HandleNew, Middlewares: []core.Middleware{api.Methods("POST"), api.AuthJWT}, }, "/roles/{role_uuid}": { Handler: roles.HandleRole, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/roles/{role_uuid}/update": { Handler: roles.HandleUpdate, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}, }, "/roles/{role_uuid}/delete": { Handler: roles.HandleDelete, Middlewares: []core.Middleware{api.Methods("DELETE"), api.AuthJWT}, }, "/permissions": { Handler: permissions.HandlePermissions, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/permissions/{permission_id}": { Handler: permissions.HandlePermission, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/permissions/resources/{resource}": { Handler: permissions.HandlePermissionsResource, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/roles/{role_uuid}/permissions/": { Handler: roles.HandleRolePermissions, Middlewares: []core.Middleware{api.Methods("GET"), api.AuthJWT}, }, "/roles/{role_uuid}/permissions/{permission_id}/add": { Handler: roles.HandleAddPermission, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}, }, "/roles/{role_uuid}/permissions/{permission_id}/remove": { Handler: roles.HandleRemovePermission, Middlewares: []core.Middleware{api.Methods("PATCH"), api.AuthJWT}, }, "/contact": { Handler: api.HandleContact, Middlewares: []core.Middleware{api.Methods("POST"), CSRFMiddleware}, }, "/csrf-token": { Handler: api.HandleCSRF, Middlewares: []core.Middleware{api.Methods("GET"), CSRFMiddleware}, }, }) fmt.Printf("Serving on port %s\n", port) err = http.ListenAndServe(fmt.Sprintf(":%s", port), api.CORS(mux)) if err != nil { fmt.Printf("Error starting server: %s\n", err) } }