This repository has been archived on 2024-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
core-old/internal/router/rest/ennoblement.go
Dawid Wysokiński 912d39158f
All checks were successful
continuous-integration/drone/push Build is passing
refactor: query params (#183)
Reviewed-on: twhelp/core#183
2023-02-13 05:06:07 +00:00

183 lines
9.4 KiB
Go

package rest
import (
"context"
"net/http"
"net/url"
"gitea.dwysokinski.me/twhelp/core/internal/domain"
"gitea.dwysokinski.me/twhelp/core/internal/router/rest/internal/model"
)
//counterfeiter:generate -o internal/mock/ennoblement_service.gen.go . EnnoblementService
type EnnoblementService interface {
ListCountWithRelations(ctx context.Context, params domain.ListEnnoblementsParams) ([]domain.EnnoblementWithRelations, int64, error)
}
type ennoblement struct {
svc EnnoblementService
}
// @ID listEnnoblements
// @Summary List ennoblements
// @Description List all ennoblements
// @Tags versions,servers,ennoblements
// @Produce json
// @Success 200 {object} model.ListEnnoblementsResp
// @Success 400 {object} model.ErrorResp
// @Success 404 {object} model.ErrorResp
// @Failure 500 {object} model.ErrorResp
// @Header 200 {integer} X-Total-Count "Total number of records"
// @Param versionCode path string true "Version code"
// @Param serverKey path string true "Server key"
// @Param since query string false "only show items created after the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param before query string false "only show items created before the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param offset query int false "specifies where to start a page" minimum(0) default(0)
// @Param limit query int false "page size" minimum(1) maximum(200) default(200)
// @Param sort query []string false "format: field:direction, default: [createdAt:asc]" Enums(createdAt:asc,createdAt:desc)
// @Router /versions/{versionCode}/servers/{serverKey}/ennoblements [get]
func (e *ennoblement) list(w http.ResponseWriter, r *http.Request) {
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
return params
})
}
// @ID listPlayerEnnoblements
// @Summary List ennoblements of a particular player
// @Description List ennoblements of a particular player
// @Tags versions,servers,players,ennoblements
// @Produce json
// @Success 200 {object} model.ListEnnoblementsResp
// @Success 400 {object} model.ErrorResp
// @Success 404 {object} model.ErrorResp
// @Failure 500 {object} model.ErrorResp
// @Header 200 {integer} X-Total-Count "Total number of records"
// @Param versionCode path string true "Version code"
// @Param serverKey path string true "Server key"
// @Param playerId path integer true "Player ID"
// @Param since query string false "only show items created after the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param before query string false "only show items created before the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param offset query int false "specifies where to start a page" minimum(0) default(0)
// @Param limit query int false "page size" minimum(1) maximum(200) default(200)
// @Param sort query []string false "format: field:direction, default: [createdAt:asc]" Enums(createdAt:asc,createdAt:desc)
// @Router /versions/{versionCode}/servers/{serverKey}/players/{playerId}/ennoblements [get]
func (e *ennoblement) listPlayer(w http.ResponseWriter, r *http.Request) {
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
p, _ := playerFromContext(r.Context())
params.PlayerID = p.ID
return params
})
}
// @ID listVillageEnnoblements
// @Summary List ennoblements of a particular village
// @Description List ennoblements of a particular village
// @Tags versions,servers,villages,ennoblements
// @Produce json
// @Success 200 {object} model.ListEnnoblementsResp
// @Success 400 {object} model.ErrorResp
// @Success 404 {object} model.ErrorResp
// @Failure 500 {object} model.ErrorResp
// @Header 200 {integer} X-Total-Count "Total number of records"
// @Param versionCode path string true "Version code"
// @Param serverKey path string true "Server key"
// @Param villageId path integer true "Village ID"
// @Param since query string false "only show items created after the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param before query string false "only show items created before the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param offset query int false "specifies where to start a page" minimum(0) default(0)
// @Param limit query int false "page size" minimum(1) maximum(200) default(200)
// @Param sort query []string false "format: field:direction, default: [createdAt:asc]" Enums(createdAt:asc,createdAt:desc)
// @Router /versions/{versionCode}/servers/{serverKey}/villages/{villageId}/ennoblements [get]
func (e *ennoblement) listVillage(w http.ResponseWriter, r *http.Request) {
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
vlg, _ := villageFromContext(r.Context())
params.VillageID = vlg.ID
return params
})
}
// @ID listTribeEnnoblements
// @Summary List ennoblements of a particular tribe
// @Description List ennoblements of a particular tribe
// @Tags versions,servers,tribes,ennoblements
// @Produce json
// @Success 200 {object} model.ListEnnoblementsResp
// @Success 400 {object} model.ErrorResp
// @Success 404 {object} model.ErrorResp
// @Failure 500 {object} model.ErrorResp
// @Header 200 {integer} X-Total-Count "Total number of records"
// @Param versionCode path string true "Version code"
// @Param serverKey path string true "Server key"
// @Param tribeId path integer true "Tribe ID"
// @Param since query string false "only show items created after the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param before query string false "only show items created before the given time, this is a timestamp in RFC 3339 format" format(date-time)
// @Param offset query int false "specifies where to start a page" minimum(0) default(0)
// @Param limit query int false "page size" minimum(1) maximum(200) default(200)
// @Param sort query []string false "format: field:direction, default: [createdAt:asc]" Enums(createdAt:asc,createdAt:desc)
// @Router /versions/{versionCode}/servers/{serverKey}/tribes/{tribeId}/ennoblements [get]
func (e *ennoblement) listTribe(w http.ResponseWriter, r *http.Request) {
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
trb, _ := tribeFromContext(r.Context())
params.TribeID = trb.ID
return params
})
}
func (e *ennoblement) renderList(
w http.ResponseWriter,
r *http.Request,
paramsModifierFunc func(*http.Request, domain.ListEnnoblementsParams) domain.ListEnnoblementsParams,
) {
ctx := r.Context()
params, err := e.parseListParams(ctx, r.URL.Query())
if err != nil {
renderErr(w, err)
return
}
ennoblements, count, err := e.svc.ListCountWithRelations(ctx, paramsModifierFunc(r, params))
if err != nil {
renderErr(w, err)
return
}
setTotalCountHeader(w.Header(), count)
renderJSON(w, http.StatusOK, model.NewListEnnoblementsResp(ennoblements))
}
func (e *ennoblement) parseListParams(ctx context.Context, values url.Values) (domain.ListEnnoblementsParams, error) {
var err error
srv, _ := serverFromContext(ctx)
params := domain.ListEnnoblementsParams{
ServerKeys: []string{srv.Key},
}
query := queryParams[domain.EnnoblementSort]{
values: values,
newSort: domain.NewEnnoblementSort,
}
params.CreatedAtGTE, err = query.nullTime("since")
if err != nil {
return domain.ListEnnoblementsParams{}, err
}
params.CreatedAtLTE, err = query.nullTime("before")
if err != nil {
return domain.ListEnnoblementsParams{}, err
}
params.Pagination, err = query.pagination()
if err != nil {
return domain.ListEnnoblementsParams{}, err
}
params.Sort, err = query.sort()
if err != nil {
return domain.ListEnnoblementsParams{}, err
}
return params, nil
}