From 9ce78a883da2a678a798b6385934503b5de41e1e Mon Sep 17 00:00:00 2001 From: "tristan-mihai.radulescu" Date: Wed, 6 Nov 2024 20:21:07 +0100 Subject: [PATCH 1/2] feat(GIST-80): add paginate on gists --- docs/openapi.json | 2 +- gists/controller.go | 24 +++++++++++++++++++++++- gists/model.go | 4 ++-- gists/service.go | 4 ++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/docs/openapi.json b/docs/openapi.json index 4f22a6a..9d4772b 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -1 +1 @@ -{"openapi":"3.0.1","info":{"title":"Gists","description":"","version":"1.0.0"},"tags":[],"paths":{"/auth/local/begin":{"post":{"summary":"Authenticate to the application wth a token","deprecated":false,"description":"Request a one time code by email and get registered or authenticated automatically","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}},"example":{"email":"radulescutristan@gmail.com"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"email":"radulescutristan@gmail.com"}}}}},"headers":{}}},"security":[]}},"/auth/local/verify":{"post":{"summary":"Confirm local authentication request","deprecated":false,"description":"Once you received your one time code, get your auth cookie with this route. It will be named `gists.access_token`","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"token":{"type":"string"}},"required":["email","token"]},"example":{"email":"radulescutristan@gmail.com","token":"234244"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"message":"You are now logged in"}}}}},"headers":{}}},"security":[]}},"/auth/google":{"get":{"summary":"Authenticate with google","deprecated":false,"description":"Authenticate with google, and get redirected directly to gists's frontend","tags":[],"parameters":[],"responses":{"302":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[]}},"/auth/github":{"get":{"summary":"Authenticate with github","deprecated":false,"description":"Authenticate with github, and get redirected directly to gists's frontend","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[]}},"/auth/identity/renew":{"post":{"summary":"Refresh identity","deprecated":false,"description":"If you receive a 401 on a protected route by a JWT because your access token expired you can use this route to refresh your tokens.","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists":{"post":{"summary":"Create a gist","deprecated":false,"description":"Create a gist and link it to an organization as an option","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"},"content":{"type":"string"},"org_id":{"type":"string"},"language":{"type":"string"},"description":{"type":"string"}},"required":["name","content"]},"example":{"name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat."}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gist"},"examples":{"1":{"summary":"Success","value":{"id":"10","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4"}}}}},"headers":{}}},"security":[{"bearer":[]}]},"get":{"summary":"Get all gists","deprecated":false,"description":"Retrieve all your gists","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Gist"}},"examples":{"1":{"summary":"Fetch all gists","value":[{"id":"4","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4","org_id":"3"},{"id":"9","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4"}]}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/name":{"patch":{"summary":"Update gist's name","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"}},"required":["name"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/description":{"patch":{"summary":"Update gist's description","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","description":"name"}},"required":["description"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/language":{"patch":{"summary":"Update gist's language","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"7","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"language":{"type":"string","description":"name"}},"required":["language"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/content":{"patch":{"summary":"Update gist's content","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"}},"required":["name"]},"example":{"content":"ezaeeza"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}":{"get":{"summary":"Get a gist","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"4","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gist"}}},"headers":{}}},"security":[{"bearer":[]}]},"delete":{"summary":"Delete a gist","deprecated":false,"description":"Delete a gist","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"*/*":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":"Gist deleted successfully"}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs":{"post":{"summary":"Create an organization","deprecated":false,"description":"Create an organization by providing its name","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"example":{"name":"Test organization 2"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"id":"8","name":"Test organization 2"}}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/":{"get":{"summary":"get all orgs of user","deprecated":false,"description":"Get all your organizations (not the gists)","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":[{"id":"3","name":"Test organization 2"},{"id":"8","name":"Test organization 2"}]}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/3":{"get":{"summary":"Get all gists ids from organization","deprecated":false,"description":"Get all the gists created in your organization.","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"id":"3","name":"Test organization 2","gists":["4"]}}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/{id}":{"delete":{"summary":"Delete an organization","deprecated":false,"description":"Delete an organization. Fails if not owner","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/user/me":{"get":{"summary":"Retrieve user informations","deprecated":false,"description":"Retrieve your personnal information such as your email, profile picture...","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"picture":{"type":"string"}},"required":["id","name","email","picture"]},"examples":{"1":{"summary":"Success","value":{"id":"8","name":"","email":"radulescutristan@gmail.com","picture":"https://lh3.googleusercontent.com/a-/ALV-UjVFT4VKCiYyND2v4fPS323_CZN0EE7zwHdQ1jFwdah3Sv5FspPa=s96-c"}}}}},"headers":{}}},"security":[{"bearer":[]}]}}},"components":{"schemas":{"Gist":{"type":"object","properties":{"id":{"type":"string","description":"ID"},"name":{"type":"string","description":"file name (should contain an extension but not mandatory to cover for instance Dockerfile)"},"content":{"type":"string","description":"content"},"language":{"type":"string","description":"programing/description/config... language"},"description":{"type":"string","description":"A few word long description of your gist"},"owner_id":{"type":"string","description":"Creator of the gist"}},"required":["id","name","content","description","owner_id"]}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"servers":[]} \ No newline at end of file +{"openapi":"3.0.1","info":{"title":"Gists","description":"","version":"1.0.0"},"tags":[],"paths":{"/auth/local/begin":{"post":{"summary":"Authenticate to the application wth a token","deprecated":false,"description":"Request a one time code by email and get registered or authenticated automatically","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}},"example":{"email":"radulescutristan@gmail.com"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"email":"radulescutristan@gmail.com"}}}}},"headers":{}}},"security":[]}},"/auth/local/verify":{"post":{"summary":"Confirm local authentication request","deprecated":false,"description":"Once you received your one time code, get your auth cookie with this route. It will be named `gists.access_token`","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string"},"token":{"type":"string"}},"required":["email","token"]},"example":{"email":"radulescutristan@gmail.com","token":"234244"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"message":"You are now logged in"}}}}},"headers":{}}},"security":[]}},"/auth/google":{"get":{"summary":"Authenticate with google","deprecated":false,"description":"Authenticate with google, and get redirected directly to gists's frontend","tags":[],"parameters":[],"responses":{"302":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[]}},"/auth/github":{"get":{"summary":"Authenticate with github","deprecated":false,"description":"Authenticate with github, and get redirected directly to gists's frontend","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[]}},"/auth/identity/renew":{"post":{"summary":"Refresh identity","deprecated":false,"description":"If you receive a 401 on a protected route by a JWT because your access token expired you can use this route to refresh your tokens.","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists":{"post":{"summary":"Create a gist","deprecated":false,"description":"Create a gist and link it to an organization as an option","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"},"content":{"type":"string"},"org_id":{"type":"string"},"language":{"type":"string"},"description":{"type":"string"},"visibility":{"type":"string","description":"Default is public"}},"required":["name","content"]},"example":{"name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat."}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Gist"},"examples":{"1":{"summary":"Success","value":{"id":"10","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4"}}}}},"headers":{}}},"security":[{"bearer":[]}]},"get":{"summary":"Get all gists","deprecated":false,"description":"Retrieve all your gists","tags":[],"parameters":[{"name":"limit","in":"query","description":"Limit is set to 50 by default\n","required":false,"schema":{"type":"integer"}},{"name":"offset","in":"query","description":"Default is an offset of 0 which is just the start","required":false,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Gist"}},"examples":{"1":{"summary":"Fetch all gists","value":[{"id":"4","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4","org_id":"3"},{"id":"9","name":"temporibus sit amet","content":"Similique veniam illum laudantium sit. Officiis vitae esse accusantium. Deserunt hic distinctio dolores eos delectus enim reprehenderit sunt. Saepe doloremque iusto accusamus praesentium. Non deserunt aspernatur voluptate dolorem voluptas repellat quo nam modi. Nihil perferendis sapiente officiis quam voluptas ducimus tempora velit quaerat.","owner_id":"4"}]}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/name":{"patch":{"summary":"Update gist's name","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"}},"required":["name"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/description":{"patch":{"summary":"Update gist's description","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"description":{"type":"string","description":"name"}},"required":["description"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/language":{"patch":{"summary":"Update gist's language","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"7","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"language":{"type":"string","description":"name"}},"required":["language"]},"example":{"name":"doloremque dolorum nobis"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}/content":{"patch":{"summary":"Update gist's content","deprecated":false,"description":"","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"name"}},"required":["name"]},"example":{"content":"ezaeeza"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"string"}}},"headers":{}}},"security":[{"bearer":[]}]}},"/gists/{id}":{"get":{"summary":"Get a raw gist","deprecated":false,"description":"Retrieve gist content as text plain","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"4","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"*/*":{"schema":{"$ref":"#/components/schemas/Gist"}}},"headers":{}}},"security":[{"bearer":[]}]},"delete":{"summary":"Delete a gist","deprecated":false,"description":"Delete a gist","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"example":"1","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"*/*":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":"Gist deleted successfully"}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs":{"post":{"summary":"Create an organization","deprecated":false,"description":"Create an organization by providing its name","tags":[],"parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]},"example":{"name":"Test organization 2"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"id":"8","name":"Test organization 2"}}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/":{"get":{"summary":"get all orgs of user","deprecated":false,"description":"Get all your organizations (not the gists)","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":[{"id":"3","name":"Test organization 2"},{"id":"8","name":"Test organization 2"}]}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/3":{"get":{"summary":"Get all gists ids from organization","deprecated":false,"description":"Get all the gists created in your organization.","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}},"examples":{"1":{"summary":"Success","value":{"id":"3","name":"Test organization 2","gists":["4"]}}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/orgs/{id}":{"delete":{"summary":"Delete an organization","deprecated":false,"description":"Delete an organization. Fails if not owner","tags":[],"parameters":[{"name":"id","in":"path","description":"","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{}}}},"headers":{}}},"security":[{"bearer":[]}]}},"/user/me":{"get":{"summary":"Retrieve user informations","deprecated":false,"description":"Retrieve your personnal information such as your email, profile picture...","tags":[],"parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"},"picture":{"type":"string"}},"required":["id","name","email","picture"]},"examples":{"1":{"summary":"Success","value":{"id":"8","name":"","email":"radulescutristan@gmail.com","picture":"https://lh3.googleusercontent.com/a-/ALV-UjVFT4VKCiYyND2v4fPS323_CZN0EE7zwHdQ1jFwdah3Sv5FspPa=s96-c"}}}}},"headers":{}}},"security":[{"bearer":[]}]}}},"components":{"schemas":{"Gist":{"type":"object","properties":{"id":{"type":"string","description":"ID"},"name":{"type":"string","description":"file name (should contain an extension but not mandatory to cover for instance Dockerfile)"},"content":{"type":"string","description":"content"},"language":{"type":"string","description":"programing/description/config... language"},"description":{"type":"string","description":"A few word long description of your gist"},"owner_id":{"type":"string","description":"Creator of the gist"},"visibility":{"type":"string"}},"required":["id","name","content","description","owner_id","visibility"]}},"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"servers":[]} \ No newline at end of file diff --git a/gists/controller.go b/gists/controller.go index 61edbfc..083464a 100644 --- a/gists/controller.go +++ b/gists/controller.go @@ -1,6 +1,8 @@ package gists import ( + "strconv" + "github.com/go-playground/validator/v10" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/log" @@ -83,7 +85,27 @@ func (g *GistControllerImpl) UpdateName() fiber.Handler { func (g *GistControllerImpl) FindAll() fiber.Handler { return func(c *fiber.Ctx) error { owner_id := c.Locals("pub").(string) - gists, err := GistService.FindAll(owner_id) + limit_param := c.Query("limit") + offset_param := c.Query("offset") + + if limit_param == "" { + limit_param = "50" + } + + if offset_param == "" { + offset_param = "0" + } + + limit, err := strconv.Atoi(limit_param) + if err != nil { + return c.Status(400).SendString("limit must be a number") + } + offset, err := strconv.Atoi(offset_param) + if err != nil { + return c.Status(400).SendString("offset must be a number") + } + + gists, err := GistService.FindAll(owner_id, limit, offset) if err != nil { return c.Status(500).SendString(err.Error()) } diff --git a/gists/model.go b/gists/model.go index f2171a7..a1b7a48 100644 --- a/gists/model.go +++ b/gists/model.go @@ -105,11 +105,11 @@ func (g *GistSQL) FindByID(id string) (*Gist, error) { return &gists[0], err } -func (g *GistSQL) FindAll() ([]Gist, error) { +func (g *GistSQL) FindAll(limit int, offset int) ([]Gist, error) { db := storage.PogoDatabase gists := make([]Gist, 0) - err := pogo.SuperQuery(db, "SELECT :fields FROM gists WHERE owner = $1", &gists, g.OwnerID.String) + err := pogo.SuperQuery(db, "SELECT :fields FROM gists WHERE owner = $1 LIMIT $2 OFFSET $3", &gists, g.OwnerID.String, limit, offset) if len(gists) <= 0 { log.Error(err) return nil, errors.New("gist not found") diff --git a/gists/service.go b/gists/service.go index 32ab05b..e619a82 100644 --- a/gists/service.go +++ b/gists/service.go @@ -230,7 +230,7 @@ func (g *GistServiceImpl) Delete(id string, owner_id string) error { return nil } -func (g *GistServiceImpl) FindAll(owner_id string) ([]Gist, error) { +func (g *GistServiceImpl) FindAll(owner_id string, limit int, offset int) ([]Gist, error) { m := GistSQL{ OwnerID: sql.NullString{ @@ -238,7 +238,7 @@ func (g *GistServiceImpl) FindAll(owner_id string) ([]Gist, error) { Valid: true, }, } - gists, err := m.FindAll() + gists, err := m.FindAll(limit, offset) if err != nil { return nil, errors.New("couldn't get gists") } From 40655810bf3c754678f48f039da9ef9b292e8601 Mon Sep 17 00:00:00 2001 From: "tristan-mihai.radulescu" Date: Fri, 8 Nov 2024 13:55:48 +0100 Subject: [PATCH 2/2] feat(GIST-80): added nb pages to gists --- gists/controller.go | 10 +++++++++- gists/model.go | 16 ++++++++++++++++ gists/service.go | 15 +++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/gists/controller.go b/gists/controller.go index 083464a..3090f71 100644 --- a/gists/controller.go +++ b/gists/controller.go @@ -110,7 +110,15 @@ func (g *GistControllerImpl) FindAll() fiber.Handler { return c.Status(500).SendString(err.Error()) } - return c.JSON(gists) + nb_pages, err := GistService.GetPageCount(owner_id, limit) + if err != nil { + return c.Status(500).SendString(err.Error()) + } + + return c.JSON(map[string]interface{}{ + "gists": gists, + "nb_pages": nb_pages, + }) } } diff --git a/gists/model.go b/gists/model.go index a1b7a48..35f6bcf 100644 --- a/gists/model.go +++ b/gists/model.go @@ -116,3 +116,19 @@ func (g *GistSQL) FindAll(limit int, offset int) ([]Gist, error) { } return gists, err } + +func (g *GistSQL) Count() (int, error) { + db := storage.PogoDatabase + var count int + rows, err := db.Query("SELECT COUNT(*) FROM gists WHERE owner = $1", g.OwnerID.String) + + rows.Next() + + rows.Scan(&count) + + if err != nil { + log.Error(err) + return 0, errors.New("couldn't get gists") + } + return count, nil +} diff --git a/gists/service.go b/gists/service.go index e619a82..bca0826 100644 --- a/gists/service.go +++ b/gists/service.go @@ -260,6 +260,21 @@ func (g *GistServiceImpl) FindByID(id string, owner_id string) (*Gist, error) { return gist, nil } +func (g *GistServiceImpl) GetPageCount(owner_id string, limit int) (int, error) { + m := GistSQL{ + OwnerID: sql.NullString{ + String: owner_id, + Valid: true, + }, + } + nb_gists, err := m.Count() + if err != nil { + return 0, errors.New("couldn't get gists count") + } + nb_pages := int(nb_gists / limit) + return nb_pages, nil +} + func gistExists(id string, owner_id string) error { m := GistSQL{