serve frontend from go

This commit is contained in:
u80864958
2025-05-05 10:00:50 +02:00
parent a06444c4df
commit 73a62b63ae
88 changed files with 76 additions and 36 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
blog.db
**/.DS_Store

2
.vscode/launch.json vendored
View File

@ -10,7 +10,7 @@
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceFolder}/backend/cmd/",
"program": "${workspaceFolder}/cmd/",
"args": ["serve"]
}
]

BIN
backend Executable file

Binary file not shown.

1
backend/.gitignore vendored
View File

@ -1 +0,0 @@
blog.db

Binary file not shown.

View File

@ -6,8 +6,8 @@ import (
"net/http"
"os"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/config"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/initialize"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/config"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/initialize"
"go-simpler.org/env"
)

View File

@ -1,4 +1,4 @@
module git.schreifuchs.ch/schreifuchs/ng-blog/backend
module git.schreifuchs.ch/schreifuchs/ng-blog
go 1.24.2

View File

@ -10,7 +10,7 @@ import (
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
)
// Signup handles user signup by decoding request body, hashing the password, and saving user data to the database.

View File

@ -7,7 +7,7 @@ import (
"strings"
"time"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
jwt "github.com/golang-jwt/jwt/v5"
)

View File

@ -5,7 +5,7 @@ import (
"testing"
"time"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
"github.com/google/uuid"
"gorm.io/driver/sqlite"
"gorm.io/gorm"

View File

@ -4,7 +4,7 @@ import (
"net/http"
"slices"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
)
// Authenticated: This function is a middleware that authenticates incoming HTTP requests using JWT tokens and role-based access control.

View File

@ -4,7 +4,7 @@ import (
"log"
"time"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
jwt "github.com/golang-jwt/jwt/v5"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"

View File

@ -3,7 +3,7 @@ package config
import (
"time"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth"
)
// Config holds configuration settings for the application, loaded from environment variables.

View File

@ -3,23 +3,39 @@ package initialize
import (
"net/http"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/config"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/posts"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/pkg/cors"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/config"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/posts"
"git.schreifuchs.ch/schreifuchs/ng-blog/pkg/cors"
"git.schreifuchs.ch/schreifuchs/ng-blog/pkg/middlewares"
"git.schreifuchs.ch/schreifuchs/ng-blog/web"
"github.com/gorilla/mux"
)
// CreateMux creates and configures a mux router with authentication and post-related routes.
func CreateMux(cfg *config.Config) (r *mux.Router) {
r = mux.NewRouter()
r.Use(cors.HandlerForOrigin("*"))
app(r.PathPrefix("/api").Subrouter(), cfg)
frontend := web.Frontend
r.PathPrefix("/").Handler(middlewares.AddPrefix("/dist/frontend/browser", http.FileServerFS(frontend)))
r.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// The CORS middleware should set up the headers for you
w.WriteHeader(http.StatusNoContent)
})
return
}
func app(r *mux.Router, cfg *config.Config) {
db := model.Init()
blg := posts.New(db)
auth := auth.New(&cfg.Auth, db)
r = mux.NewRouter()
r.Use(cors.HandlerForOrigin("*"))
// auth
r.HandleFunc("/login", auth.Login).Methods("POST")
r.HandleFunc("/signup", auth.Signup).Methods("POST")
@ -30,11 +46,4 @@ func CreateMux(cfg *config.Config) (r *mux.Router) {
r.Handle("/posts", auth.Authenticated(blg.SavePost, model.RoleUser, model.RoleAdmin)).Methods("PUT")
r.Handle("/posts/{postID}", auth.Authenticated(blg.DeletePost, model.RoleUser, model.RoleAdmin)).Methods("DELETE")
r.Handle("/posts", http.HandlerFunc(blg.GetAllPosts)).Methods("GET")
r.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// The CORS middleware should set up the headers for you
w.WriteHeader(http.StatusNoContent)
})
return
}

View File

@ -7,8 +7,8 @@ import (
"net/http"
"strconv"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
"github.com/gorilla/mux"
)

View File

@ -6,8 +6,8 @@ import (
"log"
"net/http"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
"golang.org/x/crypto/bcrypt"
)

View File

@ -7,8 +7,8 @@ import (
"log"
"net/http"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/backend/internal/model"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/auth"
"git.schreifuchs.ch/schreifuchs/ng-blog/internal/model"
"github.com/google/uuid"
"github.com/gorilla/mux"
"gorm.io/gorm"

View File

@ -0,0 +1,25 @@
package middlewares
import (
"net/http"
"net/url"
)
func AddPrefix(prefix string, h http.Handler) http.Handler {
if prefix == "" {
return h
}
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
p := prefix + r.URL.Path
rp := prefix + r.URL.RawPath
r2 := new(http.Request)
*r2 = *r
r2.URL = new(url.URL)
*r2.URL = *r.URL
r2.URL.Path = p
r2.URL.RawPath = rp
h.ServeHTTP(w, r2)
})
}

6
web/embed.go Normal file
View File

@ -0,0 +1,6 @@
package web
import "embed"
//go:embed all:dist/frontend/browser
var Frontend embed.FS

View File

@ -1,11 +1,11 @@
{
"name": "frontend",
"name": "web",
"version": "0.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "frontend",
"name": "web",
"version": "0.0.0",
"dependencies": {
"@angular/common": "^19.2.0",

View File

@ -1,5 +1,5 @@
{
"name": "frontend",
"name": "web",
"version": "0.0.0",
"scripts": {
"ng": "ng",

View File

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -1,4 +1,4 @@
export const environment = {
production: false,
apiRoot: 'http://localhost:8080',
apiRoot: 'http://localhost:8080/api',
};