From ef1577a212d1b5c6f908a59b943a512d33d312fe Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 8 Aug 2024 20:00:06 +0900 Subject: feat(backend/worker): enable `revive` in `golangci-lint` --- backend/api/handler.go | 147 ++++++++++++++++++++++++++++++++++++++++ backend/api/handler_wrapper.go | 4 +- backend/api/handlers.go | 148 ----------------------------------------- 3 files changed, 149 insertions(+), 150 deletions(-) create mode 100644 backend/api/handler.go delete mode 100644 backend/api/handlers.go (limited to 'backend/api') diff --git a/backend/api/handler.go b/backend/api/handler.go new file mode 100644 index 0000000..57d7464 --- /dev/null +++ b/backend/api/handler.go @@ -0,0 +1,147 @@ +package api + +import ( + "context" + "errors" + "net/http" + + "github.com/jackc/pgx/v5" + "github.com/labstack/echo/v4" + + "github.com/nsfisis/iosdc-japan-2024-albatross/backend/auth" + "github.com/nsfisis/iosdc-japan-2024-albatross/backend/db" +) + +type Handler struct { + q *db.Queries + hubs GameHubsInterface +} + +type GameHubsInterface interface { + StartGame(gameID int) error +} + +func (h *Handler) PostLogin(ctx context.Context, request PostLoginRequestObject) (PostLoginResponseObject, error) { + username := request.Body.Username + password := request.Body.Password + userID, err := auth.Login(ctx, h.q, username, password) + if err != nil { + return PostLogin401JSONResponse{ + UnauthorizedJSONResponse: UnauthorizedJSONResponse{ + Message: "Invalid username or password", + }, + }, nil + } + + user, err := h.q.GetUserByID(ctx, int32(userID)) + if err != nil { + return PostLogin401JSONResponse{ + UnauthorizedJSONResponse: UnauthorizedJSONResponse{ + Message: "Invalid username or password", + }, + }, nil + } + + jwt, err := auth.NewJWT(&user) + if err != nil { + return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + + return PostLogin200JSONResponse{ + Token: jwt, + }, nil +} + +func (h *Handler) GetToken(_ context.Context, _ GetTokenRequestObject, user *auth.JWTClaims) (GetTokenResponseObject, error) { + newToken, err := auth.NewShortLivedJWT(user) + if err != nil { + return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return GetToken200JSONResponse{ + Token: newToken, + }, nil +} + +func (h *Handler) GetGames(ctx context.Context, _ GetGamesRequestObject, user *auth.JWTClaims) (GetGamesResponseObject, error) { + gameRows, err := h.q.ListGamesForPlayer(ctx, int32(user.UserID)) + if err != nil { + return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + games := make([]Game, len(gameRows)) + for i, row := range gameRows { + var startedAt *int + if row.StartedAt.Valid { + startedAtTimestamp := int(row.StartedAt.Time.Unix()) + startedAt = &startedAtTimestamp + } + var problem *Problem + if row.ProblemID != nil { + if row.Title == nil || row.Description == nil { + panic("inconsistent data") + } + problem = &Problem{ + ProblemID: int(*row.ProblemID), + Title: *row.Title, + Description: *row.Description, + } + } + games[i] = Game{ + GameID: int(row.GameID), + GameType: GameGameType(row.GameType), + State: GameState(row.State), + DisplayName: row.DisplayName, + DurationSeconds: int(row.DurationSeconds), + StartedAt: startedAt, + Problem: problem, + } + } + return GetGames200JSONResponse{ + Games: games, + }, nil +} + +func (h *Handler) GetGame(ctx context.Context, request GetGameRequestObject, user *auth.JWTClaims) (GetGameResponseObject, error) { + // TODO: check user permission + gameID := request.GameID + row, err := h.q.GetGameByID(ctx, int32(gameID)) + if err != nil { + if errors.Is(err, pgx.ErrNoRows) { + return GetGame404JSONResponse{ + NotFoundJSONResponse: NotFoundJSONResponse{ + Message: "Game not found", + }, + }, nil + } + return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + var startedAt *int + if row.StartedAt.Valid { + startedAtTimestamp := int(row.StartedAt.Time.Unix()) + startedAt = &startedAtTimestamp + } + var problem *Problem + if row.ProblemID != nil { + if row.Title == nil || row.Description == nil { + panic("inconsistent data") + } + if user.IsAdmin || (GameState(row.State) != Closed && GameState(row.State) != WaitingEntries) { + problem = &Problem{ + ProblemID: int(*row.ProblemID), + Title: *row.Title, + Description: *row.Description, + } + } + } + game := Game{ + GameID: int(row.GameID), + GameType: GameGameType(row.GameType), + State: GameState(row.State), + DisplayName: row.DisplayName, + DurationSeconds: int(row.DurationSeconds), + StartedAt: startedAt, + Problem: problem, + } + return GetGame200JSONResponse{ + Game: game, + }, nil +} diff --git a/backend/api/handler_wrapper.go b/backend/api/handler_wrapper.go index 748af66..69b9baa 100644 --- a/backend/api/handler_wrapper.go +++ b/backend/api/handler_wrapper.go @@ -14,12 +14,12 @@ import ( var _ StrictServerInterface = (*ApiHandlerWrapper)(nil) type ApiHandlerWrapper struct { - innerHandler APIHandler + innerHandler Handler } func NewHandler(queries *db.Queries, hubs GameHubsInterface) *ApiHandlerWrapper { return &ApiHandlerWrapper{ - innerHandler: APIHandler{ + innerHandler: Handler{ q: queries, hubs: hubs, }, diff --git a/backend/api/handlers.go b/backend/api/handlers.go deleted file mode 100644 index 229246f..0000000 --- a/backend/api/handlers.go +++ /dev/null @@ -1,148 +0,0 @@ -package api - -import ( - "context" - "errors" - "net/http" - - "github.com/jackc/pgx/v5" - "github.com/labstack/echo/v4" - - "github.com/nsfisis/iosdc-japan-2024-albatross/backend/auth" - "github.com/nsfisis/iosdc-japan-2024-albatross/backend/db" -) - -type APIHandler struct { - q *db.Queries - hubs GameHubsInterface -} - -type GameHubsInterface interface { - StartGame(gameID int) error -} - -func (h *APIHandler) PostLogin(ctx context.Context, request PostLoginRequestObject) (PostLoginResponseObject, error) { - username := request.Body.Username - password := request.Body.Password - userID, err := auth.Login(ctx, h.q, username, password) - if err != nil { - return PostLogin401JSONResponse{ - UnauthorizedJSONResponse: UnauthorizedJSONResponse{ - Message: "Invalid username or password", - }, - }, nil - } - - user, err := h.q.GetUserByID(ctx, int32(userID)) - if err != nil { - return PostLogin401JSONResponse{ - UnauthorizedJSONResponse: UnauthorizedJSONResponse{ - Message: "Invalid username or password", - }, - }, nil - } - - jwt, err := auth.NewJWT(&user) - if err != nil { - return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - - return PostLogin200JSONResponse{ - Token: jwt, - }, nil -} - -func (h *APIHandler) GetToken(ctx context.Context, request GetTokenRequestObject, user *auth.JWTClaims) (GetTokenResponseObject, error) { - newToken, err := auth.NewShortLivedJWT(user) - if err != nil { - return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - return GetToken200JSONResponse{ - Token: newToken, - }, nil -} - -func (h *APIHandler) GetGames(ctx context.Context, request GetGamesRequestObject, user *auth.JWTClaims) (GetGamesResponseObject, error) { - gameRows, err := h.q.ListGamesForPlayer(ctx, int32(user.UserID)) - if err != nil { - return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - games := make([]Game, len(gameRows)) - for i, row := range gameRows { - var startedAt *int - if row.StartedAt.Valid { - startedAtTimestamp := int(row.StartedAt.Time.Unix()) - startedAt = &startedAtTimestamp - } - var problem *Problem - if row.ProblemID != nil { - if row.Title == nil || row.Description == nil { - panic("inconsistent data") - } - problem = &Problem{ - ProblemID: int(*row.ProblemID), - Title: *row.Title, - Description: *row.Description, - } - } - games[i] = Game{ - GameID: int(row.GameID), - GameType: GameGameType(row.GameType), - State: GameState(row.State), - DisplayName: row.DisplayName, - DurationSeconds: int(row.DurationSeconds), - StartedAt: startedAt, - Problem: problem, - } - } - return GetGames200JSONResponse{ - Games: games, - }, nil -} - -func (h *APIHandler) GetGame(ctx context.Context, request GetGameRequestObject, user *auth.JWTClaims) (GetGameResponseObject, error) { - // TODO: check user permission - gameID := request.GameID - row, err := h.q.GetGameByID(ctx, int32(gameID)) - if err != nil { - if errors.Is(err, pgx.ErrNoRows) { - return GetGame404JSONResponse{ - NotFoundJSONResponse: NotFoundJSONResponse{ - Message: "Game not found", - }, - }, nil - } else { - return nil, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - } - var startedAt *int - if row.StartedAt.Valid { - startedAtTimestamp := int(row.StartedAt.Time.Unix()) - startedAt = &startedAtTimestamp - } - var problem *Problem - if row.ProblemID != nil { - if row.Title == nil || row.Description == nil { - panic("inconsistent data") - } - if user.IsAdmin || (GameState(row.State) != Closed && GameState(row.State) != WaitingEntries) { - problem = &Problem{ - ProblemID: int(*row.ProblemID), - Title: *row.Title, - Description: *row.Description, - } - } - } - game := Game{ - GameID: int(row.GameID), - GameType: GameGameType(row.GameType), - State: GameState(row.State), - DisplayName: row.DisplayName, - DurationSeconds: int(row.DurationSeconds), - StartedAt: startedAt, - Problem: problem, - } - return GetGame200JSONResponse{ - Game: game, - }, nil -} -- cgit v1.2.3-70-g09d2