diff --git a/apis/hole/apis.go b/apis/hole/apis.go index cb5f866..ba268f1 100644 --- a/apis/hole/apis.go +++ b/apis/hole/apis.go @@ -19,6 +19,48 @@ import ( . "treehole_next/utils" ) +// ListHomePage +// +// @Summary List Holes In Home Page +// @Tags Hole +// @Produce json +// @Router /holes/_homepage [get] +// @Param object query ShowHomePageModel false "query" +// @Success 200 {array} Hole +// @Failure 404 {object} MessageModel +// @Failure 500 {object} MessageModel +func ListHomePage(c *fiber.Ctx) (err error) { + var query ShowHomePageModel + err = common.ValidateQuery(c, &query) + if err != nil { + return err + } + + divisionIDs, err := HomepageDivisionIDs(DB, query.ExcludeDivisionIDs) + if err != nil { + return err + } + + if len(divisionIDs) == 0 { + return Serialize(c, &Holes{}) + } + + // get holes + var holes Holes + querySet, err := holes.MakeQuerySet(query.Offset, query.Size, query.Order, c) + if err != nil { + return err + } + + querySet = querySet.Where("hole.division_id in (?)", divisionIDs) + err = querySet.Find(&holes).Error + if err != nil { + return err + } + + return Serialize(c, &holes) +} + // ListHolesByDivision // // @Summary List Holes In A Division diff --git a/apis/hole/routes.go b/apis/hole/routes.go index 777e522..b95d2ed 100644 --- a/apis/hole/routes.go +++ b/apis/hole/routes.go @@ -7,6 +7,9 @@ import ( ) func RegisterRoutes(app fiber.Router) { + // // order: match first route + // app.Get("/divisions/1/holes", ListHomePage) + app.Get("/holes/_homepage", ListHomePage) app.Get("/divisions/:id/holes", ListHolesByDivision) app.Get("/tags/:name/holes", ListHolesByTag) app.Get("/users/me/holes", ListHolesByMe) diff --git a/apis/hole/schemas.go b/apis/hole/schemas.go index 8c5d98d..23fe016 100644 --- a/apis/hole/schemas.go +++ b/apis/hole/schemas.go @@ -9,6 +9,16 @@ import ( "treehole_next/models" ) +type ShowHomePageModel struct { + // default is all + ExcludeDivisionIDs *[]int `json:"exclude_division_ids" query:"exclude_division_ids" validate:"omitempty"` + + Size int `json:"size" query:"size" default:"10" validate:"max=10"` + // updated time < offset (default is now) + Offset common.CustomTime `json:"offset" query:"offset" swaggertype:"string"` + Order string `json:"order" query:"order"` +} + type QueryTime struct { Size int `json:"size" query:"size" default:"10" validate:"max=10"` // updated time < offset (default is now) diff --git a/docs/docs.go b/docs/docs.go index fe7e6a3..6209fcd 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -1189,6 +1189,70 @@ const docTemplate = `{ } } }, + "/holes/_homepage": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Hole" + ], + "summary": "List Holes In Home Page", + "parameters": [ + { + "type": "array", + "items": { + "type": "integer" + }, + "collectionFormat": "csv", + "description": "default is all", + "name": "exclude_division_ids", + "in": "query" + }, + { + "type": "string", + "description": "updated time \u003c offset (default is now)", + "name": "offset", + "in": "query" + }, + { + "type": "string", + "name": "order", + "in": "query" + }, + { + "maximum": 10, + "type": "integer", + "default": 10, + "name": "size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Hole" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/models.MessageModel" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/models.MessageModel" + } + } + } + } + }, "/holes/{hole_id}/floors": { "get": { "produces": [ @@ -3383,6 +3447,18 @@ const docTemplate = `{ } } }, + "gorm.DeletedAt": { + "type": "object", + "properties": { + "time": { + "type": "string" + }, + "valid": { + "description": "Valid is true if Time is not NULL", + "type": "boolean" + } + } + }, "hole.CreateModel": { "type": "object", "required": [ @@ -3526,6 +3602,9 @@ const docTemplate = `{ "$ref": "#/definitions/models.Hole" } }, + "show_in_home_page": { + "type": "boolean" + }, "time_created": { "type": "string" }, @@ -3773,6 +3852,9 @@ const docTemplate = `{ "time_created": { "type": "string" }, + "time_deleted": { + "$ref": "#/definitions/gorm.DeletedAt" + }, "time_updated": { "type": "string" }, @@ -3912,6 +3994,9 @@ const docTemplate = `{ "description": "start from end_time of previous punishment (punishment accumulation of different floors)\nif no previous punishment or previous punishment end time less than time.Now() (synced), set start time time.Now()", "type": "string" }, + "updated_at": { + "type": "string" + }, "user_id": { "description": "user punished", "type": "integer" diff --git a/docs/swagger.json b/docs/swagger.json index 3670970..797e126 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -1182,6 +1182,70 @@ } } }, + "/holes/_homepage": { + "get": { + "produces": [ + "application/json" + ], + "tags": [ + "Hole" + ], + "summary": "List Holes In Home Page", + "parameters": [ + { + "type": "array", + "items": { + "type": "integer" + }, + "collectionFormat": "csv", + "description": "default is all", + "name": "exclude_division_ids", + "in": "query" + }, + { + "type": "string", + "description": "updated time \u003c offset (default is now)", + "name": "offset", + "in": "query" + }, + { + "type": "string", + "name": "order", + "in": "query" + }, + { + "maximum": 10, + "type": "integer", + "default": 10, + "name": "size", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Hole" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "$ref": "#/definitions/models.MessageModel" + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/models.MessageModel" + } + } + } + } + }, "/holes/{hole_id}/floors": { "get": { "produces": [ @@ -3376,6 +3440,18 @@ } } }, + "gorm.DeletedAt": { + "type": "object", + "properties": { + "time": { + "type": "string" + }, + "valid": { + "description": "Valid is true if Time is not NULL", + "type": "boolean" + } + } + }, "hole.CreateModel": { "type": "object", "required": [ @@ -3519,6 +3595,9 @@ "$ref": "#/definitions/models.Hole" } }, + "show_in_home_page": { + "type": "boolean" + }, "time_created": { "type": "string" }, @@ -3766,6 +3845,9 @@ "time_created": { "type": "string" }, + "time_deleted": { + "$ref": "#/definitions/gorm.DeletedAt" + }, "time_updated": { "type": "string" }, @@ -3905,6 +3987,9 @@ "description": "start from end_time of previous punishment (punishment accumulation of different floors)\nif no previous punishment or previous punishment end time less than time.Now() (synced), set start time time.Now()", "type": "string" }, + "updated_at": { + "type": "string" + }, "user_id": { "description": "user punished", "type": "integer" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 5428a05..f85f753 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -235,6 +235,14 @@ definitions: time_updated: type: string type: object + gorm.DeletedAt: + properties: + time: + type: string + valid: + description: Valid is true if Time is not NULL + type: boolean + type: object hole.CreateModel: properties: content: @@ -337,6 +345,8 @@ definitions: items: $ref: '#/definitions/models.Hole' type: array + show_in_home_page: + type: boolean time_created: type: string time_updated: @@ -510,6 +520,8 @@ definitions: type: array time_created: type: string + time_deleted: + $ref: '#/definitions/gorm.DeletedAt' time_updated: type: string view: @@ -610,6 +622,8 @@ definitions: start from end_time of previous punishment (punishment accumulation of different floors) if no previous punishment or previous punishment end time less than time.Now() (synced), set start time time.Now() type: string + updated_at: + type: string user_id: description: user punished type: integer @@ -1610,6 +1624,48 @@ paths: summary: List good holes tags: - Hole + /holes/_homepage: + get: + parameters: + - collectionFormat: csv + description: default is all + in: query + items: + type: integer + name: exclude_division_ids + type: array + - description: updated time < offset (default is now) + in: query + name: offset + type: string + - in: query + name: order + type: string + - default: 10 + in: query + maximum: 10 + name: size + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/models.Hole' + type: array + "404": + description: Not Found + schema: + $ref: '#/definitions/models.MessageModel' + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/models.MessageModel' + summary: List Holes In Home Page + tags: + - Hole /holes/{hole_id}/floors: get: parameters: diff --git a/models/division.go b/models/division.go index 0443caa..15ed8c7 100644 --- a/models/division.go +++ b/models/division.go @@ -30,6 +30,18 @@ type Division struct { /// generated field DivisionID int `json:"division_id" gorm:"-:all"` + + ShowInHomePage bool `json:"show_in_home_page" gorm:"not null;default:true"` +} + +func HomepageDivisionIDs(tx *gorm.DB, excludeDivisionIDs *[]int) (divisionIDs []int, err error) { + if excludeDivisionIDs != nil { + err = tx.Select("id").Where("show_in_home_page = ? AND id NOT IN ?", true, excludeDivisionIDs).Find(&divisionIDs).Error + return + } + + err = tx.Select("id").Where("show_in_home_page = ?", true).Find(&divisionIDs).Error + return } func (division *Division) GetID() int {