package endpoints import ( "context" "fmt" "relynolli-server/models" "relynolli-server/status" "relynolli-server/storage" "time" "github.com/gin-gonic/gin" ) type handlers struct{} type Handlers interface { GetNews(c *gin.Context) RetrieveNews(c *gin.Context) } func GetHandlers() Handlers { return &handlers{} } type ListNewsRequest struct { Limit int `form:"limit" ` Page int `form:"page"` } func (h *handlers) GetNews(c *gin.Context) { ctx := context.Background() meta := models.Meta{ RequestStarted: time.Now().Unix(), } query := ListNewsRequest{ Limit: 10, Page: 1, } err := c.ShouldBindQuery(&query) if err != nil { meta.RequestFinished = time.Now().Unix() c.JSON(400, models.Response{ Status: status.STATUS_BAD_REQUEST, Info: fmt.Sprintf("Error: %s", err.Error()), Meta: &meta, }) return } s := storage.NewStorageNews() count, resp, err := s.GetNews(ctx, int64(query.Limit), int64(query.Limit * (query.Page - 1))) if err != nil { meta.RequestFinished = time.Now().Unix() c.JSON(500, models.Response{ Status: status.STATUS_SERVER_ERROR, Info: fmt.Sprintf("Error: %s", err.Error()), Meta: &meta, }) return } meta.Count = count meta.Limit = query.Limit meta.Page = query.Page c.JSON(200, models.Response{ Status: status.STATUS_OK, Data: resp, Meta: &meta, }) } type retireveNewsReq struct { Code string `uri:"code" binding:"required"` } func (h *handlers) RetrieveNews(c *gin.Context) { ctx := context.Background() meta := models.Meta { RequestStarted: time.Now().Unix(), } query := new(retireveNewsReq) err := c.ShouldBindUri(query) if err != nil { meta.RequestFinished = time.Now().Unix() c.JSON(400, models.Response{ Status: status.STATUS_BAD_REQUEST, Info: fmt.Sprintf("Error: %s", err.Error()), Meta: &meta, }) return } s := storage.NewStorageNews() resp, _ := s.RetrieveNews(ctx, query.Code) meta.RequestFinished = time.Now().Unix() statusResult := status.STATUS_OK responseCode := 200 if resp == nil { statusResult = status.STATUS_NOT_FOUND responseCode = 404 } c.JSON(responseCode, models.Response{ Status: statusResult, Data: resp, Meta: &meta, }) }