diff --git a/Makefile b/Makefile index 7a7bb12..bde898f 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ fmt: vet: fmt go vet ./... -build: vet +build: cd web && pnpm run build go build -v -o solopm-server ./cmd/server diff --git a/assets/avatars/system.png b/assets/avatars/system.png new file mode 100644 index 0000000..5fb9f9a Binary files /dev/null and b/assets/avatars/system.png differ diff --git a/assets/avatars/zombie.png b/assets/avatars/zombie.png new file mode 100644 index 0000000..f815152 Binary files /dev/null and b/assets/avatars/zombie.png differ diff --git a/cmd/server/main.go b/cmd/server/main.go index c7b71a8..9484e2b 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -9,6 +9,8 @@ import ( "path/filepath" "time" + "solopm.com/solopm-server/auth" + "github.com/alexedwards/scs/v2" "github.com/joho/godotenv" ) @@ -22,7 +24,7 @@ func main() { } // handle authentication - sessionManager = scs.New() + sessionManager = scs.NewServerMux() sessionManager.Lifetime = 24 * time.Hour // handle frontend views diff --git a/internal/auth/handler.go b/internal/auth/handler.go new file mode 100644 index 0000000..aadb0ff --- /dev/null +++ b/internal/auth/handler.go @@ -0,0 +1,21 @@ +package auth + +import ( + + "github.com/alexedwards/scs/v2" + "golang.org/x/crypto/bcrypt" +) + +// remember, if anyone attempts to login as the system or zombie user, fail them. hard. + +// sessionManager needs to be figured out. do i inherit that from somewhere else? +// does it get associated with any other one like PHP's `session_open()` if i call it here? + + +func set(writer http.ResponseWriter, request *http.Request) { + sessionManager.Put(request.Context(), "sessionKey", "message to be passed around") +} + +func get(writer http.ResponseWriter, request *http.Request) String { + return sessionManager.GetString(request.Context(), "sessionKey") +} diff --git a/internal/auth/middleware.go b/internal/auth/middleware.go new file mode 100644 index 0000000..bf068dc --- /dev/null +++ b/internal/auth/middleware.go @@ -0,0 +1,3 @@ +package auth + +//import () diff --git a/internal/auth/oauth.go b/internal/auth/oauth.go new file mode 100644 index 0000000..9b3d757 --- /dev/null +++ b/internal/auth/oauth.go @@ -0,0 +1,4 @@ +package auth + +//import () + diff --git a/internal/auth/service.go b/internal/auth/service.go new file mode 100644 index 0000000..b7bb249 --- /dev/null +++ b/internal/auth/service.go @@ -0,0 +1,16 @@ +package auth + +import ( + "net/http" +) + + +func requireAuth(next http.Handler) http.Handler { + return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { + if !sessionManager.Exists(request.Context(), "userID") { + http.Redirect(writer, request, "/login", http.StatusSeeOther) + return + } + next.ServeHTTP(writer, request) + }) +} \ No newline at end of file diff --git a/internal/db/database.sqlite b/internal/db/database.sqlite new file mode 100644 index 0000000..ffc5f17 Binary files /dev/null and b/internal/db/database.sqlite differ diff --git a/internal/db/migrations/copy.sh b/internal/db/migrations/copy.sh new file mode 100644 index 0000000..532225d --- /dev/null +++ b/internal/db/migrations/copy.sh @@ -0,0 +1,40 @@ +#!/usr/bin/bash + +for up_file in *.up.sql; do + down_file="${up_file%.up.sql}.down.sql" + quoted_text=$(sed -n '3s/[^"]*\("[^"]*"\).*/\1/p' "$up_file") + first_line=$(head -n 1 "$up_file") + + if [[ "$first_line" != *".up.sql" ]]; then + sed -i "1s/$/\.up\.sql/" "$up_file" + fi + + head -n 3 "$up_file" > "$down_file" + echo "DROP TABLE IF EXISTS ${quoted_text};" >> "$down_file" + tail -n 1 "$up_file" >> "$down_file" +done + +sed -i 's/\bCREATE\b/DROP/g' *.down.sql + +for file in *.sql; do + [ -f "$file" ] || continue + line3=$(sed -n '3p' "$file") + len=${#line3} + + if [ "$len" -lt 64 ]; then + needed=$((64 - len)) + dashes=$(printf '%*s' "$needed" | tr ' ' '-') + sed -i "3s/$/$dashes/" "$file" + fi +done + + + +for file in *.down.sql; do + [ -f "$file" ] || continue + first_line=$(head -n 1 "$file") + + if [[ "$first_line" == *".up.sql" ]]; then + sed -i '1s/\.up\.sql$/\.down\.sql/' "$file" + fi +done \ No newline at end of file diff --git a/internal/db/seeders/.gitignore b/internal/db/seeders/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/internal/db/seeders/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/internal/issue/handler.go b/internal/issue/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/issue/model.go b/internal/issue/model.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/issue/repository.go b/internal/issue/repository.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/issue/service.go b/internal/issue/service.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/project/handler.go b/internal/project/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/project/model.go b/internal/project/model.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/project/repository.go b/internal/project/repository.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/project/service.go b/internal/project/service.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/server/router.go b/internal/server/router.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/server/server.go b/internal/server/server.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/user/handler.go b/internal/user/handler.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/user/model.go b/internal/user/model.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/user/repository.go b/internal/user/repository.go new file mode 100644 index 0000000..e69de29 diff --git a/internal/user/service.go b/internal/user/service.go new file mode 100644 index 0000000..e69de29 diff --git a/web/index.html b/web/index.html index ab2bbaf..472e5dc 100644 --- a/web/index.html +++ b/web/index.html @@ -1,17 +1,75 @@ - -
- - -