diff --git a/api/_build/openapi.yaml b/api/_build/openapi.yaml index 2ee6cdc..e2c7409 100644 --- a/api/_build/openapi.yaml +++ b/api/_build/openapi.yaml @@ -419,12 +419,7 @@ paths: schema: type: integer format: int64 - - name: title_id - in: query - required: true - schema: - type: integer - format: int64 + example: 123 responses: '200': description: Title successfully deleted @@ -586,6 +581,7 @@ 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 6208050..6af01d0 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -112,7 +112,8 @@ type Title struct { TitleNames map[string][]string `json:"title_names"` // TitleStatus Title status - TitleStatus *TitleStatus `json:"title_status,omitempty"` + TitleStatus *TitleStatus `json:"title_status,omitempty"` + AdditionalProperties map[string]interface{} `json:"-"` } // TitleSort Title sort order @@ -190,13 +191,13 @@ type GetTitlesParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } -// GetTitleParams defines parameters for GetTitle. -type GetTitleParams struct { +// GetTitlesTitleIdParams defines parameters for GetTitlesTitleId. +type GetTitlesTitleIdParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } -// GetUsersIdParams defines parameters for GetUsersId. -type GetUsersIdParams struct { +// GetUsersUserIdParams defines parameters for GetUsersUserId. +type GetUsersUserIdParams struct { Fields *string `form:"fields,omitempty" json:"fields,omitempty"` } @@ -218,11 +219,6 @@ 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"` @@ -268,6 +264,248 @@ 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 @@ -275,16 +513,16 @@ type ServerInterface interface { GetTitles(c *gin.Context, params GetTitlesParams) // Get title description // (GET /titles/{title_id}) - GetTitle(c *gin.Context, titleId int64, params GetTitleParams) + GetTitlesTitleId(c *gin.Context, titleId int64, params GetTitlesTitleIdParams) // Get user info // (GET /users/{user_id}) - GetUsersId(c *gin.Context, userId string, params GetUsersIdParams) + GetUsersUserId(c *gin.Context, userId string, params GetUsersUserIdParams) // 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, params DeleteUserTitleParams) + DeleteUserTitle(c *gin.Context, userId int64) // Get user titles // (GET /users/{user_id}/titles) GetUsersUserIdTitles(c *gin.Context, userId string, params GetUsersUserIdTitlesParams) @@ -411,8 +649,8 @@ func (siw *ServerInterfaceWrapper) GetTitles(c *gin.Context) { siw.Handler.GetTitles(c, params) } -// GetTitle operation middleware -func (siw *ServerInterfaceWrapper) GetTitle(c *gin.Context) { +// GetTitlesTitleId operation middleware +func (siw *ServerInterfaceWrapper) GetTitlesTitleId(c *gin.Context) { var err error @@ -426,7 +664,7 @@ func (siw *ServerInterfaceWrapper) GetTitle(c *gin.Context) { } // Parameter object where we will unmarshal all parameters from the context - var params GetTitleParams + var params GetTitlesTitleIdParams // ------------- Optional query parameter "fields" ------------- @@ -443,11 +681,11 @@ func (siw *ServerInterfaceWrapper) GetTitle(c *gin.Context) { } } - siw.Handler.GetTitle(c, titleId, params) + siw.Handler.GetTitlesTitleId(c, titleId, params) } -// GetUsersId operation middleware -func (siw *ServerInterfaceWrapper) GetUsersId(c *gin.Context) { +// GetUsersUserId operation middleware +func (siw *ServerInterfaceWrapper) GetUsersUserId(c *gin.Context) { var err error @@ -461,7 +699,7 @@ func (siw *ServerInterfaceWrapper) GetUsersId(c *gin.Context) { } // Parameter object where we will unmarshal all parameters from the context - var params GetUsersIdParams + var params GetUsersUserIdParams // ------------- Optional query parameter "fields" ------------- @@ -478,7 +716,7 @@ func (siw *ServerInterfaceWrapper) GetUsersId(c *gin.Context) { } } - siw.Handler.GetUsersId(c, userId, params) + siw.Handler.GetUsersUserId(c, userId, params) } // UpdateUser operation middleware @@ -519,24 +757,6 @@ 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() { @@ -544,7 +764,7 @@ func (siw *ServerInterfaceWrapper) DeleteUserTitle(c *gin.Context) { } } - siw.Handler.DeleteUserTitle(c, userId, params) + siw.Handler.DeleteUserTitle(c, userId) } // GetUsersUserIdTitles operation middleware @@ -746,8 +966,8 @@ func RegisterHandlersWithOptions(router gin.IRouter, si ServerInterface, options } router.GET(options.BaseURL+"/titles", wrapper.GetTitles) - router.GET(options.BaseURL+"/titles/:title_id", wrapper.GetTitle) - router.GET(options.BaseURL+"/users/:user_id", wrapper.GetUsersId) + router.GET(options.BaseURL+"/titles/:title_id", wrapper.GetTitlesTitleId) + router.GET(options.BaseURL+"/users/:user_id", wrapper.GetUsersUserId) 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) @@ -801,94 +1021,94 @@ func (response GetTitles500Response) VisitGetTitlesResponse(w http.ResponseWrite return nil } -type GetTitleRequestObject struct { +type GetTitlesTitleIdRequestObject struct { TitleId int64 `json:"title_id"` - Params GetTitleParams + Params GetTitlesTitleIdParams } -type GetTitleResponseObject interface { - VisitGetTitleResponse(w http.ResponseWriter) error +type GetTitlesTitleIdResponseObject interface { + VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error } -type GetTitle200JSONResponse Title +type GetTitlesTitleId200JSONResponse Title -func (response GetTitle200JSONResponse) VisitGetTitleResponse(w http.ResponseWriter) error { +func (response GetTitlesTitleId200JSONResponse) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetTitle204Response struct { +type GetTitlesTitleId204Response struct { } -func (response GetTitle204Response) VisitGetTitleResponse(w http.ResponseWriter) error { +func (response GetTitlesTitleId204Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { w.WriteHeader(204) return nil } -type GetTitle400Response struct { +type GetTitlesTitleId400Response struct { } -func (response GetTitle400Response) VisitGetTitleResponse(w http.ResponseWriter) error { +func (response GetTitlesTitleId400Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { w.WriteHeader(400) return nil } -type GetTitle404Response struct { +type GetTitlesTitleId404Response struct { } -func (response GetTitle404Response) VisitGetTitleResponse(w http.ResponseWriter) error { +func (response GetTitlesTitleId404Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { w.WriteHeader(404) return nil } -type GetTitle500Response struct { +type GetTitlesTitleId500Response struct { } -func (response GetTitle500Response) VisitGetTitleResponse(w http.ResponseWriter) error { +func (response GetTitlesTitleId500Response) VisitGetTitlesTitleIdResponse(w http.ResponseWriter) error { w.WriteHeader(500) return nil } -type GetUsersIdRequestObject struct { +type GetUsersUserIdRequestObject struct { UserId string `json:"user_id"` - Params GetUsersIdParams + Params GetUsersUserIdParams } -type GetUsersIdResponseObject interface { - VisitGetUsersIdResponse(w http.ResponseWriter) error +type GetUsersUserIdResponseObject interface { + VisitGetUsersUserIdResponse(w http.ResponseWriter) error } -type GetUsersId200JSONResponse User +type GetUsersUserId200JSONResponse User -func (response GetUsersId200JSONResponse) VisitGetUsersIdResponse(w http.ResponseWriter) error { +func (response GetUsersUserId200JSONResponse) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { w.Header().Set("Content-Type", "application/json") w.WriteHeader(200) return json.NewEncoder(w).Encode(response) } -type GetUsersId400Response struct { +type GetUsersUserId400Response struct { } -func (response GetUsersId400Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { +func (response GetUsersUserId400Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { w.WriteHeader(400) return nil } -type GetUsersId404Response struct { +type GetUsersUserId404Response struct { } -func (response GetUsersId404Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { +func (response GetUsersUserId404Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { w.WriteHeader(404) return nil } -type GetUsersId500Response struct { +type GetUsersUserId500Response struct { } -func (response GetUsersId500Response) VisitGetUsersIdResponse(w http.ResponseWriter) error { +func (response GetUsersUserId500Response) VisitGetUsersUserIdResponse(w http.ResponseWriter) error { w.WriteHeader(500) return nil } @@ -969,7 +1189,6 @@ func (response UpdateUser500Response) VisitUpdateUserResponse(w http.ResponseWri type DeleteUserTitleRequestObject struct { UserId int64 `json:"user_id"` - Params DeleteUserTitleParams } type DeleteUserTitleResponseObject interface { @@ -1200,10 +1419,10 @@ type StrictServerInterface interface { GetTitles(ctx context.Context, request GetTitlesRequestObject) (GetTitlesResponseObject, error) // Get title description // (GET /titles/{title_id}) - GetTitle(ctx context.Context, request GetTitleRequestObject) (GetTitleResponseObject, error) + GetTitlesTitleId(ctx context.Context, request GetTitlesTitleIdRequestObject) (GetTitlesTitleIdResponseObject, error) // Get user info // (GET /users/{user_id}) - GetUsersId(ctx context.Context, request GetUsersIdRequestObject) (GetUsersIdResponseObject, error) + GetUsersUserId(ctx context.Context, request GetUsersUserIdRequestObject) (GetUsersUserIdResponseObject, error) // Partially update a user account // (PATCH /users/{user_id}) UpdateUser(ctx context.Context, request UpdateUserRequestObject) (UpdateUserResponseObject, error) @@ -1260,18 +1479,18 @@ func (sh *strictHandler) GetTitles(ctx *gin.Context, params GetTitlesParams) { } } -// GetTitle operation middleware -func (sh *strictHandler) GetTitle(ctx *gin.Context, titleId int64, params GetTitleParams) { - var request GetTitleRequestObject +// GetTitlesTitleId operation middleware +func (sh *strictHandler) GetTitlesTitleId(ctx *gin.Context, titleId int64, params GetTitlesTitleIdParams) { + var request GetTitlesTitleIdRequestObject request.TitleId = titleId request.Params = params handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetTitle(ctx, request.(GetTitleRequestObject)) + return sh.ssi.GetTitlesTitleId(ctx, request.(GetTitlesTitleIdRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetTitle") + handler = middleware(handler, "GetTitlesTitleId") } response, err := handler(ctx, request) @@ -1279,8 +1498,8 @@ func (sh *strictHandler) GetTitle(ctx *gin.Context, titleId int64, params GetTit if err != nil { ctx.Error(err) ctx.Status(http.StatusInternalServerError) - } else if validResponse, ok := response.(GetTitleResponseObject); ok { - if err := validResponse.VisitGetTitleResponse(ctx.Writer); err != nil { + } else if validResponse, ok := response.(GetTitlesTitleIdResponseObject); ok { + if err := validResponse.VisitGetTitlesTitleIdResponse(ctx.Writer); err != nil { ctx.Error(err) } } else if response != nil { @@ -1288,18 +1507,18 @@ func (sh *strictHandler) GetTitle(ctx *gin.Context, titleId int64, params GetTit } } -// GetUsersId operation middleware -func (sh *strictHandler) GetUsersId(ctx *gin.Context, userId string, params GetUsersIdParams) { - var request GetUsersIdRequestObject +// GetUsersUserId operation middleware +func (sh *strictHandler) GetUsersUserId(ctx *gin.Context, userId string, params GetUsersUserIdParams) { + var request GetUsersUserIdRequestObject request.UserId = userId request.Params = params handler := func(ctx *gin.Context, request interface{}) (interface{}, error) { - return sh.ssi.GetUsersId(ctx, request.(GetUsersIdRequestObject)) + return sh.ssi.GetUsersUserId(ctx, request.(GetUsersUserIdRequestObject)) } for _, middleware := range sh.middlewares { - handler = middleware(handler, "GetUsersId") + handler = middleware(handler, "GetUsersUserId") } response, err := handler(ctx, request) @@ -1307,8 +1526,8 @@ func (sh *strictHandler) GetUsersId(ctx *gin.Context, userId string, params GetU if err != nil { ctx.Error(err) ctx.Status(http.StatusInternalServerError) - } else if validResponse, ok := response.(GetUsersIdResponseObject); ok { - if err := validResponse.VisitGetUsersIdResponse(ctx.Writer); err != nil { + } else if validResponse, ok := response.(GetUsersUserIdResponseObject); ok { + if err := validResponse.VisitGetUsersUserIdResponse(ctx.Writer); err != nil { ctx.Error(err) } } else if response != nil { @@ -1352,11 +1571,10 @@ func (sh *strictHandler) UpdateUser(ctx *gin.Context, userId int64) { } // DeleteUserTitle operation middleware -func (sh *strictHandler) DeleteUserTitle(ctx *gin.Context, userId int64, params DeleteUserTitleParams) { +func (sh *strictHandler) DeleteUserTitle(ctx *gin.Context, userId int64) { 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 0cb7092..2cff448 100644 --- a/api/paths/users-id-titles.yaml +++ b/api/paths/users-id-titles.yaml @@ -202,13 +202,7 @@ delete: type: integer format: int64 description: ID of the user to assign the title to - - in: query - name: title_id - required: true - schema: - type: integer - format: int64 - + example: 123 responses: '200': diff --git a/modules/backend/handlers/titles.go b/modules/backend/handlers/titles.go index 77af7e4..03553fd 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) GetTitle(ctx context.Context, request oapi.GetTitleRequestObject) (oapi.GetTitleResponseObject, error) { +func (s Server) GetTitlesTitleId(ctx context.Context, request oapi.GetTitlesTitleIdRequestObject) (oapi.GetTitlesTitleIdResponseObject, error) { var oapi_title oapi.Title sqlc_title, err := s.db.GetTitleByID(ctx, request.TitleId) if err != nil { if err == pgx.ErrNoRows { - return oapi.GetTitle204Response{}, nil + return oapi.GetTitlesTitleId204Response{}, nil } log.Errorf("%v", err) - return oapi.GetTitle500Response{}, nil + return oapi.GetTitlesTitleId500Response{}, nil } oapi_title, err = s.mapTitle(sqlc_title) if err != nil { log.Errorf("%v", err) - return oapi.GetTitle500Response{}, nil + return oapi.GetTitlesTitleId500Response{}, nil } - return oapi.GetTitle200JSONResponse(oapi_title), nil + return oapi.GetTitlesTitleId200JSONResponse(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 563a244..7af705e 100644 --- a/modules/backend/handlers/users.go +++ b/modules/backend/handlers/users.go @@ -16,10 +16,6 @@ import ( log "github.com/sirupsen/logrus" ) -const ( - pgErrDuplicateKey = "23505" -) - func mapUser(u sqlc.GetUserByIDRow) (oapi.User, error) { i := oapi.Image{ Id: u.AvatarID, @@ -41,24 +37,24 @@ func mapUser(u sqlc.GetUserByIDRow) (oapi.User, error) { }, nil } -func (s Server) GetUsersId(ctx context.Context, req oapi.GetUsersIdRequestObject) (oapi.GetUsersIdResponseObject, error) { +func (s Server) GetUsersUserId(ctx context.Context, req oapi.GetUsersUserIdRequestObject) (oapi.GetUsersUserIdResponseObject, error) { userID, err := parseInt64(req.UserId) if err != nil { - return oapi.GetUsersId404Response{}, nil + return oapi.GetUsersUserId404Response{}, nil } _user, err := s.db.GetUserByID(context.TODO(), userID) if err != nil { if err == pgx.ErrNoRows { - return oapi.GetUsersId404Response{}, nil + return oapi.GetUsersUserId404Response{}, nil } return nil, err } user, err := mapUser(_user) if err != nil { log.Errorf("%v", err) - return oapi.GetUsersId500Response{}, err + return oapi.GetUsersUserId500Response{}, err } - return oapi.GetUsersId200JSONResponse(user), nil + return oapi.GetUsersUserId200JSONResponse(user), nil } func sqlDate2oapi(p_date pgtype.Timestamptz) *time.Time { @@ -373,7 +369,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 == pgErrDuplicateKey { //duplicate key value + if pgErr.Code == "23505" { //duplicate key value return oapi.AddUserTitle409Response{}, nil } } else { @@ -386,7 +382,16 @@ func (s Server) AddUserTitle(ctx context.Context, request oapi.AddUserTitleReque log.Errorf("%v", err) return oapi.AddUserTitle500Response{}, nil } - oapi_usertitle := oapi.UserTitleMini{ + oapi_usertitle := struct { + Ctime *time.Time `json:"ctime,omitempty"` + Rate *int32 `json:"rate,omitempty"` + ReviewId *int64 `json:"review_id,omitempty"` + + // Status User's title status + Status oapi.UserTitleStatus `json:"status"` + TitleId int64 `json:"title_id"` + UserId int64 `json:"user_id"` + }{ Ctime: &user_title.Ctime, Rate: user_title.Rate, ReviewId: user_title.ReviewID, @@ -400,58 +405,10 @@ 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) { - 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 + panic("unimplemented") } // UpdateUserTitle implements oapi.StrictServerInterface. func (s Server) UpdateUserTitle(ctx context.Context, request oapi.UpdateUserTitleRequestObject) (oapi.UpdateUserTitleResponseObject, error) { - - status, err := UserTitleStatus2Sqlc1(request.Body.Status) - if err != nil { - log.Errorf("%v", err) - return oapi.UpdateUserTitle400Response{}, nil - } - params := sqlc.UpdateUserTitleParams{ - Status: status, - Rate: request.Body.Rate, - UserID: request.UserId, - TitleID: request.Body.TitleId, - } - - user_title, err := s.db.UpdateUserTitle(ctx, params) - if err != nil { - if err == pgx.ErrNoRows { - return oapi.UpdateUserTitle404Response{}, nil - } - log.Errorf("%v", err) - return oapi.UpdateUserTitle500Response{}, nil - } - oapi_status, err := sql2usertitlestatus(user_title.Status) - if err != nil { - log.Errorf("%v", err) - return oapi.UpdateUserTitle500Response{}, nil - } - - oapi_usertitle := oapi.UserTitleMini{ - Ctime: &user_title.Ctime, - Rate: user_title.Rate, - ReviewId: user_title.ReviewID, - Status: oapi_status, - TitleId: user_title.TitleID, - UserId: user_title.UserID, - } - - return oapi.UpdateUserTitle200JSONResponse(oapi_usertitle), nil + panic("unimplemented") } diff --git a/modules/backend/queries.sql b/modules/backend/queries.sql index 5ac2c5c..ef6e26d 100644 --- a/modules/backend/queries.sql +++ b/modules/backend/queries.sql @@ -57,6 +57,17 @@ 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 @@ -67,6 +78,10 @@ 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 @@ -363,11 +378,78 @@ 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 ( @@ -388,10 +470,4 @@ 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 9338717..89b16c9 100644 --- a/sql/queries.sql.go +++ b/sql/queries.sql.go @@ -29,32 +29,6 @@ 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 @@ -70,12 +44,40 @@ 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 @@ -109,6 +111,7 @@ 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, @@ -159,6 +162,9 @@ 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) @@ -324,6 +330,13 @@ 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, @@ -343,6 +356,46 @@ 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, @@ -813,6 +866,8 @@ func (q *Queries) SearchUserTitles(ctx context.Context, arg SearchUserTitlesPara } const updateUser = `-- name: UpdateUser :one + + UPDATE users SET avatar_id = COALESCE($1, avatar_id), @@ -841,6 +896,15 @@ 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, @@ -874,10 +938,10 @@ RETURNING user_id, title_id, status, rate, review_id, ctime ` type UpdateUserTitleParams struct { - Status *UsertitleStatusT `json:"status"` - Rate *int32 `json:"rate"` - UserID int64 `json:"user_id"` - TitleID int64 `json:"title_id"` + Status NullUsertitleStatusT `json:"status"` + Rate *int32 `json:"rate"` + UserID int64 `json:"user_id"` + TitleID int64 `json:"title_id"` } // Fails with sql.ErrNoRows if (user_id, title_id) not found diff --git a/sql/sqlc.yaml b/sql/sqlc.yaml index 8f8626a..de67bcf 100644 --- a/sql/sqlc.yaml +++ b/sql/sqlc.yaml @@ -14,11 +14,6 @@ sql: emit_pointers_for_null_types: true emit_empty_slices: true #slices returned by :many queries will be empty instead of nil overrides: - - db_type: "usertitle_status_t" - nullable: true - go_type: - type: "UsertitleStatusT" - pointer: true - db_type: "storage_type_t" nullable: true go_type: