diff --git a/api/_build/openapi.yaml b/api/_build/openapi.yaml index e2c7409..2ee6cdc 100644 --- a/api/_build/openapi.yaml +++ b/api/_build/openapi.yaml @@ -419,7 +419,12 @@ paths: schema: type: integer format: int64 - example: 123 + - name: title_id + in: query + required: true + schema: + type: integer + format: int64 responses: '200': description: Title successfully deleted @@ -581,7 +586,6 @@ components: additionalProperties: type: number format: double - additionalProperties: true required: - id - title_names diff --git a/api/api.gen.go b/api/api.gen.go index 6af01d0..6208050 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -112,8 +112,7 @@ type Title struct { TitleNames map[string][]string `json:"title_names"` // TitleStatus Title status - TitleStatus *TitleStatus `json:"title_status,omitempty"` - AdditionalProperties map[string]interface{} `json:"-"` + TitleStatus *TitleStatus `json:"title_status,omitempty"` } // TitleSort Title sort order @@ -191,13 +190,13 @@ type GetTitlesParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } -// GetTitlesTitleIdParams defines parameters for GetTitlesTitleId. -type GetTitlesTitleIdParams struct { +// GetTitleParams defines parameters for GetTitle. +type GetTitleParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } -// GetUsersUserIdParams defines parameters for GetUsersUserId. -type GetUsersUserIdParams struct { +// GetUsersIdParams defines parameters for GetUsersId. +type GetUsersIdParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } @@ -219,6 +218,11 @@ type UpdateUserJSONBody struct { UserDesc *string `json:"user_desc,omitempty"` } +// DeleteUserTitleParams defines parameters for DeleteUserTitle. +type DeleteUserTitleParams struct { + TitleId int64 `form:"title_id" json:"title_id"` +} + // GetUsersUserIdTitlesParams defines parameters for GetUsersUserIdTitles. type GetUsersUserIdTitlesParams struct { Cursor *Cursor `form:"cursor,omitempty" json:"cursor,omitempty"` @@ -264,248 +268,6 @@ type UpdateUserTitleJSONRequestBody UpdateUserTitleJSONBody // AddUserTitleJSONRequestBody defines body for AddUserTitle for application/json ContentType. type AddUserTitleJSONRequestBody AddUserTitleJSONBody -// Getter for additional properties for Title. Returns the specified -// element and whether it was found -func (a Title) Get(fieldName string) (value interface{}, found bool) { - if a.AdditionalProperties != nil { - value, found = a.AdditionalProperties[fieldName] - } - return -} - -// Setter for additional properties for Title -func (a *Title) Set(fieldName string, value interface{}) { - if a.AdditionalProperties == nil { - a.AdditionalProperties = make(map[string]interface{}) - } - a.AdditionalProperties[fieldName] = value -} - -// Override default JSON handling for Title to handle AdditionalProperties -func (a *Title) UnmarshalJSON(b []byte) error { - object := make(map[string]json.RawMessage) - err := json.Unmarshal(b, &object) - if err != nil { - return err - } - - if raw, found := object["episodes_aired"]; found { - err = json.Unmarshal(raw, &a.EpisodesAired) - if err != nil { - return fmt.Errorf("error reading 'episodes_aired': %w", err) - } - delete(object, "episodes_aired") - } - - if raw, found := object["episodes_all"]; found { - err = json.Unmarshal(raw, &a.EpisodesAll) - if err != nil { - return fmt.Errorf("error reading 'episodes_all': %w", err) - } - delete(object, "episodes_all") - } - - if raw, found := object["episodes_len"]; found { - err = json.Unmarshal(raw, &a.EpisodesLen) - if err != nil { - return fmt.Errorf("error reading 'episodes_len': %w", err) - } - delete(object, "episodes_len") - } - - if raw, found := object["id"]; found { - err = json.Unmarshal(raw, &a.Id) - if err != nil { - return fmt.Errorf("error reading 'id': %w", err) - } - delete(object, "id") - } - - if raw, found := object["poster"]; found { - err = json.Unmarshal(raw, &a.Poster) - if err != nil { - return fmt.Errorf("error reading 'poster': %w", err) - } - delete(object, "poster") - } - - if raw, found := object["rating"]; found { - err = json.Unmarshal(raw, &a.Rating) - if err != nil { - return fmt.Errorf("error reading 'rating': %w", err) - } - delete(object, "rating") - } - - if raw, found := object["rating_count"]; found { - err = json.Unmarshal(raw, &a.RatingCount) - if err != nil { - return fmt.Errorf("error reading 'rating_count': %w", err) - } - delete(object, "rating_count") - } - - if raw, found := object["release_season"]; found { - err = json.Unmarshal(raw, &a.ReleaseSeason) - if err != nil { - return fmt.Errorf("error reading 'release_season': %w", err) - } - delete(object, "release_season") - } - - if raw, found := object["release_year"]; found { - err = json.Unmarshal(raw, &a.ReleaseYear) - if err != nil { - return fmt.Errorf("error reading 'release_year': %w", err) - } - delete(object, "release_year") - } - - if raw, found := object["studio"]; found { - err = json.Unmarshal(raw, &a.Studio) - if err != nil { - return fmt.Errorf("error reading 'studio': %w", err) - } - delete(object, "studio") - } - - if raw, found := object["tags"]; found { - err = json.Unmarshal(raw, &a.Tags) - if err != nil { - return fmt.Errorf("error reading 'tags': %w", err) - } - delete(object, "tags") - } - - if raw, found := object["title_names"]; found { - err = json.Unmarshal(raw, &a.TitleNames) - if err != nil { - return fmt.Errorf("error reading 'title_names': %w", err) - } - delete(object, "title_names") - } - - if raw, found := object["title_status"]; found { - err = json.Unmarshal(raw, &a.TitleStatus) - if err != nil { - return fmt.Errorf("error reading 'title_status': %w", err) - } - delete(object, "title_status") - } - - if len(object) != 0 { - a.AdditionalProperties = make(map[string]interface{}) - for fieldName, fieldBuf := range object { - var fieldVal interface{} - err := json.Unmarshal(fieldBuf, &fieldVal) - if err != nil { - return fmt.Errorf("error unmarshaling field %s: %w", fieldName, err) - } - a.AdditionalProperties[fieldName] = fieldVal - } - } - return nil -} - -// Override default JSON handling for Title to handle AdditionalProperties -func (a Title) MarshalJSON() ([]byte, error) { - var err error - object := make(map[string]json.RawMessage) - - if a.EpisodesAired != nil { - object["episodes_aired"], err = json.Marshal(a.EpisodesAired) - if err != nil { - return nil, fmt.Errorf("error marshaling 'episodes_aired': %w", err) - } - } - - if a.EpisodesAll != nil { - object["episodes_all"], err = json.Marshal(a.EpisodesAll) - if err != nil { - return nil, fmt.Errorf("error marshaling 'episodes_all': %w", err) - } - } - - if a.EpisodesLen != nil { - object["episodes_len"], err = json.Marshal(a.EpisodesLen) - if err != nil { - return nil, fmt.Errorf("error marshaling 'episodes_len': %w", err) - } - } - - object["id"], err = json.Marshal(a.Id) - if err != nil { - return nil, fmt.Errorf("error marshaling 'id': %w", err) - } - - if a.Poster != nil { - object["poster"], err = json.Marshal(a.Poster) - if err != nil { - return nil, fmt.Errorf("error marshaling 'poster': %w", err) - } - } - - if a.Rating != nil { - object["rating"], err = json.Marshal(a.Rating) - if err != nil { - return nil, fmt.Errorf("error marshaling 'rating': %w", err) - } - } - - if a.RatingCount != nil { - object["rating_count"], err = json.Marshal(a.RatingCount) - if err != nil { - return nil, fmt.Errorf("error marshaling 'rating_count': %w", err) - } - } - - if a.ReleaseSeason != nil { - object["release_season"], err = json.Marshal(a.ReleaseSeason) - if err != nil { - return nil, fmt.Errorf("error marshaling 'release_season': %w", err) - } - } - - if a.ReleaseYear != nil { - object["release_year"], err = json.Marshal(a.ReleaseYear) - if err != nil { - return nil, fmt.Errorf("error marshaling 'release_year': %w", err) - } - } - - if a.Studio != nil { - object["studio"], err = json.Marshal(a.Studio) - if err != nil { - return nil, fmt.Errorf("error marshaling 'studio': %w", err) - } - } - - object["tags"], err = json.Marshal(a.Tags) - if err != nil { - return nil, fmt.Errorf("error marshaling 'tags': %w", err) - } - - object["title_names"], err = json.Marshal(a.TitleNames) - if err != nil { - return nil, fmt.Errorf("error marshaling 'title_names': %w", err) - } - - if a.TitleStatus != nil { - object["title_status"], err = json.Marshal(a.TitleStatus) - if err != nil { - return nil, fmt.Errorf("error marshaling 'title_status': %w", err) - } - } - - for fieldName, field := range a.AdditionalProperties { - object[fieldName], err = json.Marshal(field) - if err != nil { - return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err) - } - } - return json.Marshal(object) -} - // ServerInterface represents all server handlers. type ServerInterface interface { // Get titles @@ -513,16 +275,16 @@ type ServerInterface interface { GetTitles(c *gin.Context, params GetTitlesParams) // Get title description // (GET /titles/{title_id}) - GetTitlesTitleId(c *gin.Context, titleId int64, params GetTitlesTitleIdParams) + GetTitle(c *gin.Context, titleId int64, params GetTitleParams) // Get user info // (GET /users/{user_id}) - GetUsersUserId(c *gin.Context, userId string, params GetUsersUserIdParams) + GetUsersId(c *gin.Context, userId string, params GetUsersIdParams) // Partially update a user account // (PATCH /users/{user_id}) UpdateUser(c *gin.Context, userId int64) // Delete a usertitle // (DELETE /users/{user_id}/titles) - DeleteUserTitle(c *gin.Context, userId int64) + DeleteUserTitle(c *gin.Context, userId int64, params DeleteUserTitleParams) // Get user titles // (GET /users/{user_id}/titles) GetUsersUserIdTitles(c *gin.Context, userId string, params GetUsersUserIdTitlesParams) @@ -649,8 +411,8 @@ func (siw *ServerInterfaceWrapper) GetTitles(c *gin.Context) { siw.Handler.GetTitles(c, params) } -// GetTitlesTitleId operation middleware -func (siw *ServerInterfaceWrapper) GetTitlesTitleId(c *gin.Context) { +// GetTitle operation middleware +func (siw *ServerInterfaceWrapper) GetTitle(c *gin.Context) { var err error @@ -664,7 +426,7 @@ func (siw *ServerInterfaceWrapper) GetTitlesTitleId(c *gin.Context) { } // Parameter object where we will unmarshal all parameters from the context - var params GetTitlesTitleIdParams + var params GetTitleParams // ------------- Optional query parameter "fields" ------------- @@ -681,11 +443,11 @@ func (siw *ServerInterfaceWrapper) GetTitlesTitleId(c *gin.Context) { } } - siw.Handler.GetTitlesTitleId(c, titleId, params) + siw.Handler.GetTitle(c, titleId, params) } -// GetUsersUserId operation middleware -func (siw *ServerInterfaceWrapper) GetUsersUserId(c *gin.Context) { +// GetUsersId operation middleware +func (siw *ServerInterfaceWrapper) GetUsersId(c *gin.Context) { var err error @@ -699,7 +461,7 @@ func (siw *ServerInterfaceWrapper) GetUsersUserId(c *gin.Context) { } // Parameter object where we will unmarshal all parameters from the context - var params GetUsersUserIdParams + var params GetUsersIdParams // ------------- Optional query parameter "fields" ------------- @@ -716,7 +478,7 @@ func (siw *ServerInterfaceWrapper) GetUsersUserId(c *gin.Context) { } } - siw.Handler.GetUsersUserId(c, userId, params) + siw.Handler.GetUsersId(c, userId, params) } // UpdateUser operation middleware @@ -757,6 +519,24 @@ func (siw *ServerInterfaceWrapper) DeleteUserTitle(c *gin.Context) { return } + // Parameter object where we will unmarshal all parameters from the context + var params DeleteUserTitleParams + + // ------------- Required query parameter "title_id" ------------- + + if paramValue := c.Query("title_id"); paramValue != "" { + + } else { + siw.ErrorHandler(c, fmt.Errorf("Query argument title_id is required, but not found"), http.StatusBadRequest) + return + } + + err = runtime.BindQueryParameter("form", true, true, "title_id", c.Request.URL.Query(), ¶ms.TitleId) + if err != nil { + siw.ErrorHandler(c, fmt.Errorf("Invalid format for parameter title_id: %w", err), http.StatusBadRequest) + return + } + for _, middleware := range siw.HandlerMiddlewares { middleware(c) if c.IsAborted() { @@ -764,7 +544,7 @@ func (siw *ServerInterfaceWrapper) DeleteUserTitle(c *gin.Context) { } } - siw.Handler.DeleteUserTitle(c, userId) + siw.Handler.DeleteUserTitle(c, userId, params) } // GetUsersUserIdTitles operation middleware @@ -966,8 +746,8 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options } router.GET(options.BaseURL+"/titles", wrapper.GetTitles) - router.GET(options.BaseURL+"/titles/:title_id", wrapper.GetTitlesTitleId) - router.GET(options.BaseURL+"/users/:user_id", wrapper.GetUsersUserId) + router.GET(options.BaseURL+"/titles/:title_id", wrapper.GetTitle) + router.GET(options.BaseURL+"/users/:user_id", wrapper.GetUsersId) router.PATCH(options.BaseURL+"/users/:user_id", wrapper.UpdateUser) router.DELETE(options.BaseURL+"/users/:user_id/titles", wrapper.DeleteUserTitle) router.GET(options.BaseURL+"/users/:user_id/titles", wrapper.GetUsersUserIdTitles) @@ -1021,94 +801,94 @@ func (response GetTitles500Response) VisitGetTitlesResponse(w http.ResponseWrite return nil } -type GetTitlesTitleIdRequestObject struct { +type GetTitleRequestObject struct { TitleId int64 `json:"title_id"` - Params GetTitlesTitleIdParams + Params GetTitleParams } -type GetTitlesTitleIdResponseObject interface { - VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error +type GetTitleResponseObject interface { + VisitGetTitleResponse(w http.ResponseWriter) error } -type GetTitlesTitleId200JSONResponse Title +type GetTitle200JSONResponse Title -func (response GetTitlesTitleId200JSONResponse) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { +func (response GetTitle200JSONResponse) VisitGetTitleResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetTitlesTitleId204Response struct { +type GetTitle204Response struct { } -func (response GetTitlesTitleId204Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { +func (response GetTitle204Response) VisitGetTitleResponse(w http.ResponseWriter) error { w.WriteHeader(204) return nil } -type GetTitlesTitleId400Response struct { +type GetTitle400Response struct { } -func (response GetTitlesTitleId400Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { +func (response GetTitle400Response) VisitGetTitleResponse(w http.ResponseWriter) error { w.WriteHeader(400) return nil } -type GetTitlesTitleId404Response struct { +type GetTitle404Response struct { } -func (response GetTitlesTitleId404Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { +func (response GetTitle404Response) VisitGetTitleResponse(w http.ResponseWriter) error { w.WriteHeader(404) return nil } -type GetTitlesTitleId500Response struct { +type GetTitle500Response struct { } -func (response GetTitlesTitleId500Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { +func (response GetTitle500Response) VisitGetTitleResponse(w http.ResponseWriter) error { w.WriteHeader(500) return nil } -type GetUsersUserIdRequestObject struct { +type GetUsersIdRequestObject struct { UserId string `json:"user_id"` - Params GetUsersUserIdParams + Params GetUsersIdParams } -type GetUsersUserIdResponseObject interface { - VisitGetUsersUserIdResponse(w http.ResponseWriter) error +type GetUsersIdResponseObject interface { + VisitGetUsersIdResponse(w http.ResponseWriter) error } -type GetUsersUserId200JSONResponse User +type GetUsersId200JSONResponse User -func (response GetUsersUserId200JSONResponse) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { +func (response GetUsersId200JSONResponse) VisitGetUsersIdResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetUsersUserId400Response struct { +type GetUsersId400Response struct { } -func (response GetUsersUserId400Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { +func (response GetUsersId400Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { w.WriteHeader(400) return nil } -type GetUsersUserId404Response struct { +type GetUsersId404Response struct { } -func (response GetUsersUserId404Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { +func (response GetUsersId404Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { w.WriteHeader(404) return nil } -type GetUsersUserId500Response struct { +type GetUsersId500Response struct { } -func (response GetUsersUserId500Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { +func (response GetUsersId500Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { w.WriteHeader(500) return nil } @@ -1189,6 +969,7 @@ func (response UpdateUser500Response) VisitUpdateUserResponse(w http.ResponseWri type DeleteUserTitleRequestObject struct { UserId int64 `json:"user_id"` + Params DeleteUserTitleParams } type DeleteUserTitleResponseObject interface { @@ -1419,10 +1200,10 @@ type StrictServerInterface interface { GetTitles(ctx context.Context, request GetTitlesRequestObject) (GetTitlesResponseObject, error) // Get title description // (GET /titles/{title_id}) - GetTitlesTitleId(ctx context.Context, request GetTitlesTitleIdRequestObject) (GetTitlesTitleIdResponseObject, error) + GetTitle(ctx context.Context, request GetTitleRequestObject) (GetTitleResponseObject, error) // Get user info // (GET /users/{user_id}) - GetUsersUserId(ctx context.Context, request GetUsersUserIdRequestObject) (GetUsersUserIdResponseObject, error) + GetUsersId(ctx context.Context, request GetUsersIdRequestObject) (GetUsersIdResponseObject, error) // Partially update a user account // (PATCH /users/{user_id}) UpdateUser(ctx context.Context, request UpdateUserRequestObject) (UpdateUserResponseObject, error) @@ -1479,18 +1260,18 @@ func (sh *strictHandler) GetTitles(ctx *gin.Context, params GetTitlesParams) { } } -// GetTitlesTitleId operation middleware -func (sh *strictHandler) GetTitlesTitleId(ctx *gin.Context, titleId int64, params GetTitlesTitleIdParams) { - var request GetTitlesTitleIdRequestObject +// GetTitle operation middleware +func (sh *strictHandler) GetTitle(ctx *gin.Context, titleId int64, params GetTitleParams) { + var request GetTitleRequestObject request.TitleId = titleId request.Params = params handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetTitlesTitleId(ctx, request.(GetTitlesTitleIdRequestObject)) + return sh.ssi.GetTitle(ctx, request.(GetTitleRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetTitlesTitleId") + handler = middleware(handler, "GetTitle") } response, err := handler(ctx, request) @@ -1498,8 +1279,8 @@ func (sh *strictHandler) GetTitlesTitleId(ctx *gin.Context, titleId int64, param if err != nil { ctx.Error(err) ctx.Status(http.StatusInternalServerError) - } else if validResponse, ok := response.(GetTitlesTitleIdResponseObject); ok { - if err := validResponse.VisitGetTitlesTitleIdResponse(ctx.Writer); err != nil { + } else if validResponse, ok := response.(GetTitleResponseObject); ok { + if err := validResponse.VisitGetTitleResponse(ctx.Writer); err != nil { ctx.Error(err) } } else if response != nil { @@ -1507,18 +1288,18 @@ func (sh *strictHandler) GetTitlesTitleId(ctx *gin.Context, titleId int64, param } } -// GetUsersUserId operation middleware -func (sh *strictHandler) GetUsersUserId(ctx *gin.Context, userId string, params GetUsersUserIdParams) { - var request GetUsersUserIdRequestObject +// GetUsersId operation middleware +func (sh *strictHandler) GetUsersId(ctx *gin.Context, userId string, params GetUsersIdParams) { + var request GetUsersIdRequestObject request.UserId = userId request.Params = params handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetUsersUserId(ctx, request.(GetUsersUserIdRequestObject)) + return sh.ssi.GetUsersId(ctx, request.(GetUsersIdRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetUsersUserId") + handler = middleware(handler, "GetUsersId") } response, err := handler(ctx, request) @@ -1526,8 +1307,8 @@ func (sh *strictHandler) GetUsersUserId(ctx *gin.Context, userId string, params if err != nil { ctx.Error(err) ctx.Status(http.StatusInternalServerError) - } else if validResponse, ok := response.(GetUsersUserIdResponseObject); ok { - if err := validResponse.VisitGetUsersUserIdResponse(ctx.Writer); err != nil { + } else if validResponse, ok := response.(GetUsersIdResponseObject); ok { + if err := validResponse.VisitGetUsersIdResponse(ctx.Writer); err != nil { ctx.Error(err) } } else if response != nil { @@ -1571,10 +1352,11 @@ func (sh *strictHandler) UpdateUser(ctx *gin.Context, userId int64) { } // DeleteUserTitle operation middleware -func (sh *strictHandler) DeleteUserTitle(ctx *gin.Context, userId int64) { +func (sh *strictHandler) DeleteUserTitle(ctx *gin.Context, userId int64, params DeleteUserTitleParams) { var request DeleteUserTitleRequestObject request.UserId = userId + request.Params = params handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { return sh.ssi.DeleteUserTitle(ctx, request.(DeleteUserTitleRequestObject)) diff --git a/api/paths/users-id-titles.yaml b/api/paths/users-id-titles.yaml index 2cff448..0cb7092 100644 --- a/api/paths/users-id-titles.yaml +++ b/api/paths/users-id-titles.yaml @@ -202,7 +202,13 @@ delete: type: integer format: int64 description: ID of the user to assign the title to - example: 123 + - in: query + name: title_id + required: true + schema: + type: integer + format: int64 + responses: '200': diff --git a/modules/backend/handlers/titles.go b/modules/backend/handlers/titles.go index 03553fd..77af7e4 100644 --- a/modules/backend/handlers/titles.go +++ b/modules/backend/handlers/titles.go @@ -132,25 +132,25 @@ func (s Server) GetTagsByTitleId(ctx context.Context, id int64) (oapi.Tags, erro // return &oapi_studio, nil // } -func (s Server) GetTitlesTitleId(ctx context.Context, request oapi.GetTitlesTitleIdRequestObject) (oapi.GetTitlesTitleIdResponseObject, error) { +func (s Server) GetTitle(ctx context.Context, request oapi.GetTitleRequestObject) (oapi.GetTitleResponseObject, error) { var oapi_title oapi.Title sqlc_title, err := s.db.GetTitleByID(ctx, request.TitleId) if err != nil { if err == pgx.ErrNoRows { - return oapi.GetTitlesTitleId204Response{}, nil + return oapi.GetTitle204Response{}, nil } log.Errorf("%v", err) - return oapi.GetTitlesTitleId500Response{}, nil + return oapi.GetTitle500Response{}, nil } oapi_title, err = s.mapTitle(sqlc_title) if err != nil { log.Errorf("%v", err) - return oapi.GetTitlesTitleId500Response{}, nil + return oapi.GetTitle500Response{}, nil } - return oapi.GetTitlesTitleId200JSONResponse(oapi_title), nil + return oapi.GetTitle200JSONResponse(oapi_title), nil } func (s Server) GetTitles(ctx context.Context, request oapi.GetTitlesRequestObject) (oapi.GetTitlesResponseObject, error) { diff --git a/modules/backend/handlers/users.go b/modules/backend/handlers/users.go index 7af705e..48f80d8 100644 --- a/modules/backend/handlers/users.go +++ b/modules/backend/handlers/users.go @@ -16,6 +16,10 @@ import ( log "github.com/sirupsen/logrus" ) +const ( + pgErrDuplicateKey = "23505" +) + func mapUser(u sqlc.GetUserByIDRow) (oapi.User, error) { i := oapi.Image{ Id: u.AvatarID, @@ -37,24 +41,24 @@ func mapUser(u sqlc.GetUserByIDRow) (oapi.User, error) { }, nil } -func (s Server) GetUsersUserId(ctx context.Context, req oapi.GetUsersUserIdRequestObject) (oapi.GetUsersUserIdResponseObject, error) { +func (s Server) GetUsersId(ctx context.Context, req oapi.GetUsersIdRequestObject) (oapi.GetUsersIdResponseObject, error) { userID, err := parseInt64(req.UserId) if err != nil { - return oapi.GetUsersUserId404Response{}, nil + return oapi.GetUsersId404Response{}, nil } _user, err := s.db.GetUserByID(context.TODO(), userID) if err != nil { if err == pgx.ErrNoRows { - return oapi.GetUsersUserId404Response{}, nil + return oapi.GetUsersId404Response{}, nil } return nil, err } user, err := mapUser(_user) if err != nil { log.Errorf("%v", err) - return oapi.GetUsersUserId500Response{}, err + return oapi.GetUsersId500Response{}, err } - return oapi.GetUsersUserId200JSONResponse(user), nil + return oapi.GetUsersId200JSONResponse(user), nil } func sqlDate2oapi(p_date pgtype.Timestamptz) *time.Time { @@ -369,7 +373,7 @@ func (s Server) AddUserTitle(ctx context.Context, request oapi.AddUserTitleReque if errors.As(err, &pgErr) { // fmt.Println(pgErr.Message) // => syntax error at end of input // fmt.Println(pgErr.Code) // => 42601 - if pgErr.Code == "23505" { //duplicate key value + if pgErr.Code == pgErrDuplicateKey { //duplicate key value return oapi.AddUserTitle409Response{}, nil } } else { @@ -405,7 +409,19 @@ func (s Server) AddUserTitle(ctx context.Context, request oapi.AddUserTitleReque // DeleteUserTitle implements oapi.StrictServerInterface. func (s Server) DeleteUserTitle(ctx context.Context, request oapi.DeleteUserTitleRequestObject) (oapi.DeleteUserTitleResponseObject, error) { - panic("unimplemented") + params := sqlc.DeleteUserTitleParams{ + UserID: request.UserId, + TitleID: request.Params.TitleId, + } + _, err := s.db.DeleteUserTitle(ctx, params) + if err != nil { + if err == pgx.ErrNoRows { + return oapi.DeleteUserTitle404Response{}, nil + } + log.Errorf("%v", err) + return oapi.DeleteUserTitle500Response{}, nil + } + return oapi.DeleteUserTitle200Response{}, nil } // UpdateUserTitle implements oapi.StrictServerInterface. diff --git a/modules/backend/queries.sql b/modules/backend/queries.sql index ef6e26d..5ac2c5c 100644 --- a/modules/backend/queries.sql +++ b/modules/backend/queries.sql @@ -57,17 +57,6 @@ VALUES ( sqlc.arg('tag_names')::jsonb) RETURNING id, tag_names; --- -- name: ListUsers :many --- SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date --- FROM users --- ORDER BY user_id --- LIMIT $1 OFFSET $2; - --- -- name: CreateUser :one --- INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date) --- VALUES ($1, $2, $3, $4, $5, $6, $7) --- RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date; - -- name: UpdateUser :one UPDATE users SET @@ -78,10 +67,6 @@ SET WHERE id = sqlc.arg('user_id') RETURNING id, avatar_id, nickname, disp_name, user_desc, creation_date, mail; --- -- name: DeleteUser :exec --- DELETE FROM users --- WHERE user_id = $1; - -- name: GetTitleByID :one -- sqlc.struct: TitlesFull SELECT @@ -378,78 +363,11 @@ ORDER BY LIMIT COALESCE(sqlc.narg('limit')::int, 100); -- 100 is default limit --- -- name: ListTitles :many --- SELECT title_id, title_names, studio_id, poster_id, signal_ids, --- title_status, rating, rating_count, release_year, release_season, --- season, episodes_aired, episodes_all, episodes_len --- FROM titles --- ORDER BY title_id --- LIMIT $1 OFFSET $2; - --- -- name: UpdateTitle :one --- UPDATE titles --- SET --- title_names = COALESCE(sqlc.narg('title_names'), title_names), --- studio_id = COALESCE(sqlc.narg('studio_id'), studio_id), --- poster_id = COALESCE(sqlc.narg('poster_id'), poster_id), --- signal_ids = COALESCE(sqlc.narg('signal_ids'), signal_ids), --- title_status = COALESCE(sqlc.narg('title_status'), title_status), --- release_year = COALESCE(sqlc.narg('release_year'), release_year), --- release_season = COALESCE(sqlc.narg('release_season'), release_season), --- episodes_aired = COALESCE(sqlc.narg('episodes_aired'), episodes_aired), --- episodes_all = COALESCE(sqlc.narg('episodes_all'), episodes_all), --- episodes_len = COALESCE(sqlc.narg('episodes_len'), episodes_len) --- WHERE title_id = sqlc.arg('title_id') --- RETURNING *; - -- name: GetReviewByID :one SELECT * FROM reviews WHERE review_id = sqlc.arg('review_id')::bigint; --- -- name: CreateReview :one --- INSERT INTO reviews (user_id, title_id, image_ids, review_text, creation_date) --- VALUES ($1, $2, $3, $4, $5) --- RETURNING review_id, user_id, title_id, image_ids, review_text, creation_date; - --- -- name: UpdateReview :one --- UPDATE reviews --- SET --- image_ids = COALESCE(sqlc.narg('image_ids'), image_ids), --- review_text = COALESCE(sqlc.narg('review_text'), review_text) --- WHERE review_id = sqlc.arg('review_id') --- RETURNING *; - --- -- name: DeleteReview :exec --- DELETE FROM reviews --- WHERE review_id = $1; - --- -- name: ListReviewsByTitle :many --- SELECT review_id, user_id, title_id, image_ids, review_text, creation_date --- FROM reviews --- WHERE title_id = $1 --- ORDER BY creation_date DESC --- LIMIT $2 OFFSET $3; - --- -- name: ListReviewsByUser :many --- SELECT review_id, user_id, title_id, image_ids, review_text, creation_date --- FROM reviews --- WHERE user_id = $1 --- ORDER BY creation_date DESC --- LIMIT $2 OFFSET $3; - --- -- name: GetUserTitle :one --- SELECT usertitle_id, user_id, title_id, status, rate, review_id --- FROM usertitles --- WHERE user_id = $1 AND title_id = $2; - --- -- name: ListUserTitles :many --- SELECT usertitle_id, user_id, title_id, status, rate, review_id --- FROM usertitles --- WHERE user_id = $1 --- ORDER BY usertitle_id --- LIMIT $2 OFFSET $3; - -- name: InsertUserTitle :one INSERT INTO usertitles (user_id, title_id, status, rate, review_id) VALUES ( @@ -470,4 +388,10 @@ SET WHERE user_id = sqlc.arg('user_id') AND title_id = sqlc.arg('title_id') +RETURNING *; + +-- name: DeleteUserTitle :one +DELETE FROM usertitles +WHERE user_id = sqlc.arg('user_id') + AND title_id = sqlc.arg('title_id') RETURNING *; \ No newline at end of file diff --git a/sql/queries.sql.go b/sql/queries.sql.go index 89b16c9..24f77b4 100644 --- a/sql/queries.sql.go +++ b/sql/queries.sql.go @@ -29,6 +29,32 @@ func (q *Queries) CreateImage(ctx context.Context, arg CreateImageParams) (Image return i, err } +const deleteUserTitle = `-- name: DeleteUserTitle :one +DELETE FROM usertitles +WHERE user_id = $1 + AND title_id = $2 +RETURNING user_id, title_id, status, rate, review_id, ctime +` + +type DeleteUserTitleParams struct { + UserID int64 `json:"user_id"` + TitleID int64 `json:"title_id"` +} + +func (q *Queries) DeleteUserTitle(ctx context.Context, arg DeleteUserTitleParams) (Usertitle, error) { + row := q.db.QueryRow(ctx, deleteUserTitle, arg.UserID, arg.TitleID) + var i Usertitle + err := row.Scan( + &i.UserID, + &i.TitleID, + &i.Status, + &i.Rate, + &i.ReviewID, + &i.Ctime, + ) + return i, err +} + const getImageByID = `-- name: GetImageByID :one SELECT id, storage_type, image_path FROM images @@ -44,40 +70,12 @@ func (q *Queries) GetImageByID(ctx context.Context, illustID int64) (Image, erro const getReviewByID = `-- name: GetReviewByID :one - - SELECT id, data, rating, user_id, title_id, created_at FROM reviews WHERE review_id = $1::bigint ` // 100 is default limit -// -- name: ListTitles :many -// SELECT title_id, title_names, studio_id, poster_id, signal_ids, -// -// title_status, rating, rating_count, release_year, release_season, -// season, episodes_aired, episodes_all, episodes_len -// -// FROM titles -// ORDER BY title_id -// LIMIT $1 OFFSET $2; -// -- name: UpdateTitle :one -// UPDATE titles -// SET -// -// title_names = COALESCE(sqlc.narg('title_names'), title_names), -// studio_id = COALESCE(sqlc.narg('studio_id'), studio_id), -// poster_id = COALESCE(sqlc.narg('poster_id'), poster_id), -// signal_ids = COALESCE(sqlc.narg('signal_ids'), signal_ids), -// title_status = COALESCE(sqlc.narg('title_status'), title_status), -// release_year = COALESCE(sqlc.narg('release_year'), release_year), -// release_season = COALESCE(sqlc.narg('release_season'), release_season), -// episodes_aired = COALESCE(sqlc.narg('episodes_aired'), episodes_aired), -// episodes_all = COALESCE(sqlc.narg('episodes_all'), episodes_all), -// episodes_len = COALESCE(sqlc.narg('episodes_len'), episodes_len) -// -// WHERE title_id = sqlc.arg('title_id') -// RETURNING *; func (q *Queries) GetReviewByID(ctx context.Context, reviewID int64) (Review, error) { row := q.db.QueryRow(ctx, getReviewByID, reviewID) var i Review @@ -111,7 +109,6 @@ func (q *Queries) GetStudioByID(ctx context.Context, studioID int64) (Studio, er } const getTitleByID = `-- name: GetTitleByID :one - SELECT t.id, t.title_names, t.studio_id, t.poster_id, t.title_status, t.rating, t.rating_count, t.release_year, t.release_season, t.season, t.episodes_aired, t.episodes_all, t.episodes_len, i.storage_type as title_storage_type, @@ -162,9 +159,6 @@ type GetTitleByIDRow struct { StudioImagePath *string `json:"studio_image_path"` } -// -- name: DeleteUser :exec -// DELETE FROM users -// WHERE user_id = $1; // sqlc.struct: TitlesFull func (q *Queries) GetTitleByID(ctx context.Context, titleID int64) (GetTitleByIDRow, error) { row := q.db.QueryRow(ctx, getTitleByID, titleID) @@ -330,13 +324,6 @@ func (q *Queries) InsertTitleTags(ctx context.Context, arg InsertTitleTagsParams } const insertUserTitle = `-- name: InsertUserTitle :one - - - - - - - INSERT INTO usertitles (user_id, title_id, status, rate, review_id) VALUES ( $1::bigint, @@ -356,46 +343,6 @@ type InsertUserTitleParams struct { ReviewID *int64 `json:"review_id"` } -// -- name: CreateReview :one -// INSERT INTO reviews (user_id, title_id, image_ids, review_text, creation_date) -// VALUES ($1, $2, $3, $4, $5) -// RETURNING review_id, user_id, title_id, image_ids, review_text, creation_date; -// -- name: UpdateReview :one -// UPDATE reviews -// SET -// -// image_ids = COALESCE(sqlc.narg('image_ids'), image_ids), -// review_text = COALESCE(sqlc.narg('review_text'), review_text) -// -// WHERE review_id = sqlc.arg('review_id') -// RETURNING *; -// -- name: DeleteReview :exec -// DELETE FROM reviews -// WHERE review_id = $1; -// -// -- name: ListReviewsByTitle :many -// -// SELECT review_id, user_id, title_id, image_ids, review_text, creation_date -// FROM reviews -// WHERE title_id = $1 -// ORDER BY creation_date DESC -// LIMIT $2 OFFSET $3; -// -- name: ListReviewsByUser :many -// SELECT review_id, user_id, title_id, image_ids, review_text, creation_date -// FROM reviews -// WHERE user_id = $1 -// ORDER BY creation_date DESC -// LIMIT $2 OFFSET $3; -// -- name: GetUserTitle :one -// SELECT usertitle_id, user_id, title_id, status, rate, review_id -// FROM usertitles -// WHERE user_id = $1 AND title_id = $2; -// -- name: ListUserTitles :many -// SELECT usertitle_id, user_id, title_id, status, rate, review_id -// FROM usertitles -// WHERE user_id = $1 -// ORDER BY usertitle_id -// LIMIT $2 OFFSET $3; func (q *Queries) InsertUserTitle(ctx context.Context, arg InsertUserTitleParams) (Usertitle, error) { row := q.db.QueryRow(ctx, insertUserTitle, arg.UserID, @@ -866,8 +813,6 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara } const updateUser = `-- name: UpdateUser :one - - UPDATE users SET avatar_id = COALESCE($1, avatar_id), @@ -896,15 +841,6 @@ type UpdateUserRow struct { Mail *string `json:"mail"` } -// -- name: ListUsers :many -// SELECT user_id, avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date -// FROM users -// ORDER BY user_id -// LIMIT $1 OFFSET $2; -// -- name: CreateUser :one -// INSERT INTO users (avatar_id, passhash, mail, nickname, disp_name, user_desc, creation_date) -// VALUES ($1, $2, $3, $4, $5, $6, $7) -// RETURNING user_id, avatar_id, nickname, disp_name, user_desc, creation_date; func (q *Queries) UpdateUser(ctx context.Context, arg UpdateUserParams) (UpdateUserRow, error) { row := q.db.QueryRow(ctx, updateUser, arg.AvatarID,