2022-09-06 07:50:00 +00:00
|
|
|
package rest
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"net/http"
|
2023-01-10 06:42:51 +00:00
|
|
|
"net/url"
|
2022-09-06 07:50:00 +00:00
|
|
|
|
|
|
|
"gitea.dwysokinski.me/twhelp/core/internal/domain"
|
2023-01-14 07:23:52 +00:00
|
|
|
"gitea.dwysokinski.me/twhelp/core/internal/router/rest/internal/model"
|
2022-09-06 07:50:00 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
//counterfeiter:generate -o internal/mock/ennoblement_service.gen.go . EnnoblementService
|
|
|
|
type EnnoblementService interface {
|
2022-12-24 09:21:26 +00:00
|
|
|
ListCountWithRelations(ctx context.Context, params domain.ListEnnoblementsParams) ([]domain.EnnoblementWithRelations, int64, error)
|
2022-09-06 07:50:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2022-10-19 04:25:26 +00:00
|
|
|
// @Param limit query int false "page size" minimum(1) maximum(200) default(200)
|
2022-12-30 08:53:28 +00:00
|
|
|
// @Param sort query []string false "format: field:direction, default: [createdAt:asc]" Enums(createdAt:asc,createdAt:desc)
|
2022-09-06 07:50:00 +00:00
|
|
|
// @Router /versions/{versionCode}/servers/{serverKey}/ennoblements [get]
|
|
|
|
func (e *ennoblement) list(w http.ResponseWriter, r *http.Request) {
|
2023-02-03 07:31:32 +00:00
|
|
|
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
|
|
|
|
return params
|
|
|
|
})
|
2023-01-04 05:21:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// @ID listPlayerEnnoblements
|
2023-01-31 05:17:07 +00:00
|
|
|
// @Summary List ennoblements of a particular player
|
|
|
|
// @Description List ennoblements of a particular player
|
2023-01-04 05:21:02 +00:00
|
|
|
// @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) {
|
2023-02-03 07:31:32 +00:00
|
|
|
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
|
|
|
|
p, _ := playerFromContext(r.Context())
|
|
|
|
params.PlayerID = p.ID
|
|
|
|
return params
|
|
|
|
})
|
2023-02-02 06:40:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// @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) {
|
2023-02-03 07:31:32 +00:00
|
|
|
e.renderList(w, r, func(r *http.Request, params domain.ListEnnoblementsParams) domain.ListEnnoblementsParams {
|
|
|
|
vlg, _ := villageFromContext(r.Context())
|
|
|
|
params.VillageID = vlg.ID
|
|
|
|
return params
|
|
|
|
})
|
2023-02-03 07:17:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// @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) {
|
2023-02-03 07:31:32 +00:00
|
|
|
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,
|
|
|
|
) {
|
2023-02-03 07:17:19 +00:00
|
|
|
ctx := r.Context()
|
|
|
|
|
|
|
|
params, err := e.parseListParams(ctx, r.URL.Query())
|
|
|
|
if err != nil {
|
|
|
|
renderErr(w, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2023-02-03 07:31:32 +00:00
|
|
|
ennoblements, count, err := e.svc.ListCountWithRelations(ctx, paramsModifierFunc(r, params))
|
2022-09-06 07:50:00 +00:00
|
|
|
if err != nil {
|
|
|
|
renderErr(w, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
setTotalCountHeader(w.Header(), count)
|
|
|
|
renderJSON(w, http.StatusOK, model.NewListEnnoblementsResp(ennoblements))
|
|
|
|
}
|
2023-01-04 05:21:02 +00:00
|
|
|
|
2023-01-14 07:23:52 +00:00
|
|
|
func (e *ennoblement) parseListParams(ctx context.Context, values url.Values) (domain.ListEnnoblementsParams, error) {
|
2023-01-04 05:21:02 +00:00
|
|
|
var err error
|
2023-01-14 07:23:52 +00:00
|
|
|
srv, _ := serverFromContext(ctx)
|
2023-01-04 05:21:02 +00:00
|
|
|
params := domain.ListEnnoblementsParams{
|
2023-01-14 07:23:52 +00:00
|
|
|
ServerKeys: []string{srv.Key},
|
2023-01-04 05:21:02 +00:00
|
|
|
}
|
|
|
|
|
2023-02-13 05:06:07 +00:00
|
|
|
query := queryParams[domain.EnnoblementSort]{
|
|
|
|
values: values,
|
|
|
|
newSort: domain.NewEnnoblementSort,
|
|
|
|
}
|
2023-01-10 06:42:51 +00:00
|
|
|
|
2023-01-04 05:21:02 +00:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2023-02-13 05:06:07 +00:00
|
|
|
params.Pagination, err = query.pagination()
|
2023-01-04 05:21:02 +00:00
|
|
|
if err != nil {
|
|
|
|
return domain.ListEnnoblementsParams{}, err
|
|
|
|
}
|
|
|
|
|
2023-02-13 05:06:07 +00:00
|
|
|
params.Sort, err = query.sort()
|
2023-01-04 05:21:02 +00:00
|
|
|
if err != nil {
|
|
|
|
return domain.ListEnnoblementsParams{}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return params, nil
|
|
|
|
}
|