serve frontend from go
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
||||
blog.db
|
||||
**/.DS_Store
|
||||
|
2
.vscode/launch.json
vendored
2
.vscode/launch.json
vendored
@ -10,7 +10,7 @@
|
||||
"type": "go",
|
||||
"request": "launch",
|
||||
"mode": "auto",
|
||||
"program": "${workspaceFolder}/backend/cmd/",
|
||||
"program": "${workspaceFolder}/cmd/",
|
||||
"args": ["serve"]
|
||||
}
|
||||
]
|
||||
|
1
backend/.gitignore
vendored
1
backend/.gitignore
vendored
@ -1 +0,0 @@
|
||||
blog.db
|
BIN
backend/blog.db
BIN
backend/blog.db
Binary file not shown.
@ -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"
|
||||
)
|
@ -1,4 +1,4 @@
|
||||
module git.schreifuchs.ch/schreifuchs/ng-blog/backend
|
||||
module git.schreifuchs.ch/schreifuchs/ng-blog
|
||||
|
||||
go 1.24.2
|
||||
|
@ -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.
|
@ -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"
|
||||
)
|
||||
|
@ -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"
|
@ -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.
|
@ -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"
|
@ -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.
|
@ -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
|
||||
}
|
@ -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"
|
||||
)
|
||||
|
@ -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"
|
||||
)
|
||||
|
@ -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"
|
25
pkg/middlewares/stripprefix.go
Normal file
25
pkg/middlewares/stripprefix.go
Normal 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)
|
||||
|
||||
})
|
||||
}
|
0
frontend/.gitignore → web/.gitignore
vendored
0
frontend/.gitignore → web/.gitignore
vendored
6
web/embed.go
Normal file
6
web/embed.go
Normal file
@ -0,0 +1,6 @@
|
||||
package web
|
||||
|
||||
import "embed"
|
||||
|
||||
//go:embed all:dist/frontend/browser
|
||||
var Frontend embed.FS
|
@ -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",
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "frontend",
|
||||
"name": "web",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 37 KiB |
@ -1,4 +1,4 @@
|
||||
export const environment = {
|
||||
production: false,
|
||||
apiRoot: 'http://localhost:8080',
|
||||
apiRoot: 'http://localhost:8080/api',
|
||||
};
|
Reference in New Issue
Block a user