aboutsummaryrefslogtreecommitdiffhomepage
path: root/backend/api/handler_auth.go
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-14 11:52:56 +0900
committernsfisis <nsfisis@gmail.com>2026-02-14 11:53:08 +0900
commit2889b562e64993482bd13fd806af8ed0865bab8b (patch)
tree39400ac4d994fb33d2c544e7d4b9d98f8ecbd86a /backend/api/handler_auth.go
parente216c3bc97994b4172d15d52b46d5f6b75f35ea4 (diff)
downloadfeedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.gz
feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.tar.zst
feedaka-2889b562e64993482bd13fd806af8ed0865bab8b.zip
refactor: migrate API from GraphQL to REST (TypeSpec/OpenAPI)
Replace the entire GraphQL stack (gqlgen, urql, graphql-codegen) with a TypeSpec → OpenAPI 3.x pipeline using oapi-codegen for Go server stubs and openapi-fetch + openapi-typescript for the frontend client. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'backend/api/handler_auth.go')
-rw-r--r--backend/api/handler_auth.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/backend/api/handler_auth.go b/backend/api/handler_auth.go
new file mode 100644
index 0000000..6e10538
--- /dev/null
+++ b/backend/api/handler_auth.go
@@ -0,0 +1,73 @@
+package api
+
+import (
+ "context"
+ "database/sql"
+ "strconv"
+
+ "undef.ninja/x/feedaka/auth"
+ appcontext "undef.ninja/x/feedaka/context"
+)
+
+func (h *Handler) AuthLogin(ctx context.Context, request AuthLoginRequestObject) (AuthLoginResponseObject, error) {
+ user, err := h.Queries.GetUserByUsername(ctx, request.Body.Username)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+
+ if !auth.VerifyPassword(user.PasswordHash, request.Body.Password) {
+ return AuthLogin401JSONResponse{Message: "invalid credentials"}, nil
+ }
+
+ echoCtx := getEchoContext(ctx)
+ if echoCtx == nil {
+ return nil, errNoEchoContext
+ }
+
+ if err := h.SessionConfig.SetUserID(echoCtx, user.ID); err != nil {
+ return nil, err
+ }
+
+ return AuthLogin200JSONResponse{
+ User: User{
+ Id: strconv.FormatInt(user.ID, 10),
+ Username: user.Username,
+ },
+ }, nil
+}
+
+func (h *Handler) AuthLogout(ctx context.Context, _ AuthLogoutRequestObject) (AuthLogoutResponseObject, error) {
+ echoCtx := getEchoContext(ctx)
+ if echoCtx == nil {
+ return nil, errNoEchoContext
+ }
+
+ if err := h.SessionConfig.DestroySession(echoCtx); err != nil {
+ return nil, err
+ }
+
+ return AuthLogout204Response{}, nil
+}
+
+func (h *Handler) AuthGetCurrentUser(ctx context.Context, _ AuthGetCurrentUserRequestObject) (AuthGetCurrentUserResponseObject, error) {
+ userID, ok := appcontext.GetUserID(ctx)
+ if !ok {
+ return AuthGetCurrentUser401JSONResponse{Message: "authentication required"}, nil
+ }
+
+ user, err := h.Queries.GetUserByID(ctx, userID)
+ if err != nil {
+ if err == sql.ErrNoRows {
+ return AuthGetCurrentUser401JSONResponse{Message: "authentication required"}, nil
+ }
+ return nil, err
+ }
+
+ return AuthGetCurrentUser200JSONResponse{
+ Id: strconv.FormatInt(user.ID, 10),
+ Username: user.Username,
+ }, nil
+}