feat(API): add API

This commit is contained in:
rick 2022-10-21 03:12:22 +02:00
parent 220611a563
commit 29472384da
Signed by: Rick
GPG key ID: 4A6223D66294EB20
7 changed files with 340 additions and 9 deletions

View file

@ -3,15 +3,30 @@
## Structure du projet
* .env : fichier de configuration
* controllers : actions possibles par l'API REST
* docs : doc swagger (swagger -i)
* routes : configuration des routes
* views : fichiers html dynamiques
* dao : fichiers pour faire des requetes en BDD
* models : structures utilisées pour manipuler le contenu de la base de données
## Lancement
### Backend
Il faut mettre en place une base de données [MongoDB](https://www.mongodb.com/).
Il est nécessaire d'avoir [une application Discord](https://discord.com/developers/)
et [une clé d'API Steam](https://steamcommunity.com/dev).
Configurez ensuite le fichier `example.env` et renommez le en `.env`.
Lancez le serveur avec `go run main.go`.
### Documentation
Installer swager avec Go et lancer le. Vous pouvez démarrer le serveur et aller
sur le lien [de la documentation](localhost:8080/swagger) pour pouvoir la lire en ligne.
```
go install github.com/swaggo/swag
swag init
```

169
controllers/group.go Normal file
View file

@ -0,0 +1,169 @@
package controllers
import (
"cds/dao"
"fmt"
"github.com/gofiber/fiber/v2"
"go.mongodb.org/mongo-driver/mongo"
)
type Groupe struct {
Name int `json:"name"`
Max int `json:"max"`
Leader int `json:"leader"`
//Players []Account `json:"players"`
//Events []Event `json:events`
}
/*
type Event struct {
Id int `json:"id"`
Start int `json:"start"`
End int `json:"end"`
}
*/
// @Summary Renvoie les informations sur un groupe
// @Tags groups
// @Produce json
// @Success 200 {json} Groupe
// @Failure 400
// @Failure 404
// @Router /groups/{id} [get]
func GetInfos(c *fiber.Ctx) error {
token := checkCookie(c)
if token == "" {
return c.SendStatus(fiber.StatusForbidden)
} else {
id := c.Params("id")
group, err := dao.GetGroupById(id)
if err == mongo.ErrNoDocuments {
return c.SendStatus(fiber.StatusNotFound)
} else if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": fmt.Sprint(err),
})
} else {
return c.Status(fiber.StatusOK).JSON(group)
}
}
}
// @Summary Renvoie les events d'un groupe
// @Tags groups
// @Produce json
// @Success 200 {json} Groupe
// @Failure 400
// @Failure 404
// @Router /groups/{id}/events [get]
func GetEvents(c *fiber.Ctx) error {
return nil
}
// @Summary Créer un groupe
// @Tags groups
// @Accept json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/create [put]
func CreateGroup(c *fiber.Ctx) error {
return nil
}
// @Summary Rejoindre un groupe
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/join [put]
func JoinGroup(c *fiber.Ctx) error {
return nil
}
// @Summary Quitte un groupe
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/leave [put]
func LeaveGroupe(c *fiber.Ctx) error {
return nil
}
// @Summary Change le chef d'un groupe
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/switch [put]
func ChangeLeader(c *fiber.Ctx) error {
return nil
}
// @Summary Prépare un event
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/events/plan [put]
func CreateEvent(c *fiber.Ctx) error {
return nil
}
// @Summary Change un event
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/events/change [put]
func ChangeEvent(c *fiber.Ctx) error {
return nil
}
// @Summary Ferme un groupe et distribue les points CDS
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/end [put]
func EndGroup(c *fiber.Ctx) error {
return nil
}
// @Summary Supprime un groupe sans distribuer de points
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/cancel [delete]
func DeleteGroup(c *fiber.Ctx) error {
return nil
}
// @Summary Supprime un event
// @Tags groups
// @Accept json
// @Produce json
// @Success 200
// @Failure 400
// @Failure 404
// @Router /groups/events/cancel [delete]
func DeleteEvent(c *fiber.Ctx) error {
return nil
}

105
controllers/user.go Normal file
View file

@ -0,0 +1,105 @@
package controllers
import (
"cds/dao"
"fmt"
"github.com/gofiber/fiber/v2"
"go.mongodb.org/mongo-driver/mongo"
)
func GetUsers(c *fiber.Ctx) error {
token := checkCookie(c)
if token == "" {
return c.SendStatus(fiber.StatusForbidden)
} else {
id := c.Params("id")
group, err := dao.GetGroupById(id)
if err == mongo.ErrNoDocuments {
return c.SendStatus(fiber.StatusNotFound)
} else if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": fmt.Sprint(err),
})
} else {
return c.Status(fiber.StatusOK).JSON(group)
}
}
}
// @Summary Renvoie les informations sur le compte se trouvant sur le cookie.
// @Produce json
// @Success 200 {object} models.User
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/current [get]
func GetCurrentUser(c *fiber.Ctx) error {
token := c.Cookies("token", "")
if token == "" {
return c.SendStatus(fiber.StatusForbidden)
} else {
user, err := dao.GetById(token)
if err == mongo.ErrNoDocuments {
return c.SendStatus(fiber.StatusNotFound)
} else if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": fmt.Sprint(err),
})
} else {
return c.Status(fiber.StatusOK).JSON(user)
}
}
}
// @Summary Renvoie les informations sur le compte
// @Produce json
// @Success 200 {object} models.User
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/{id} [get]
func GetUser(c *fiber.Ctx) error {
token := checkCookie(c)
if token == "" {
return c.SendStatus(fiber.StatusForbidden)
} else {
id := c.Params("id")
user, err := dao.GetById(id)
if err == mongo.ErrNoDocuments {
return c.SendStatus(fiber.StatusNotFound)
} else if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": fmt.Sprint(err),
})
} else {
return c.Status(fiber.StatusOK).JSON(user)
}
}
}
// @Summary Renvoie la liste des groupes d'un utilisateur
// @Produce json
// @Success 200 {array} primitive.ObjectID "Liste des ids des groupes"
// @Failure 403
// @Failure 404
// @Failure 500
// @Router /users/{id}/groups [get]
func GetGroupsUser(c *fiber.Ctx) error {
token := checkCookie(c)
if token == "" {
return c.SendStatus(fiber.StatusForbidden)
} else {
id := c.Params("id")
groups, err := dao.GetGroupByMember(id)
if err == mongo.ErrNoDocuments {
return c.SendStatus(fiber.StatusNotFound)
} else if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": fmt.Sprint(err),
})
} else {
return c.Status(fiber.StatusOK).JSON(groups)
}
}
}

7
controllers/utils.go Normal file
View file

@ -0,0 +1,7 @@
package controllers
import "github.com/gofiber/fiber/v2"
func checkCookie(c *fiber.Ctx) string {
return c.Cookies("token", "")
}

19
main.go
View file

@ -4,14 +4,14 @@ import (
"cds/controllers"
"cds/dao"
"cds/models"
"cds/routes"
"fmt"
"os"
"time"
_ "cds/docs"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/template/django"
"github.com/gofiber/swagger"
"github.com/joho/godotenv"
"github.com/markbates/goth"
"github.com/markbates/goth/providers/discord"
@ -23,12 +23,11 @@ import (
//const DISCORD_API = "https://discord.com/api/v10/"
func setupRoutes(app *fiber.App) {
app.Get("/", index)
//api := app.Group("/api")
//routes.AccountRoute(api.Group("/accounts"))
//routes.GroupeRoute(api.Group("/groups"))
//app.Get("/swagger/*", swagger.HandlerDefault)
//app.Get("/", index)
api := app.Group("/api")
routes.GroupRoute(api.Group("/groups"))
routes.UserRoute(api.Group("/users"))
app.Get("/swagger/*", swagger.HandlerDefault)
app.Get("/login/:provider", goth_fiber.BeginAuthHandler)
app.Get("/auth/:provider", controllers.Auth)
@ -98,7 +97,7 @@ func main() {
panic(err)
}
app := fiber.New(fiber.Config{Views: django.New("./views", ".django")})
app := fiber.New()
goth.UseProviders(
discord.New(
os.Getenv("DISCORD_ID"),
@ -109,6 +108,8 @@ func main() {
)
setupRoutes(app)
app.Static("/", "./dist")
app.Static("/*", "./dist")
err = app.Listen(":8080")
if err != nil {

13
routes/accounts.go Normal file
View file

@ -0,0 +1,13 @@
package routes
import (
"cds/controllers"
"github.com/gofiber/fiber/v2"
)
func UserRoute(route fiber.Router) {
route.Get("/current", controllers.GetCurrentUser)
route.Get("/:id", controllers.GetUser)
route.Get("/:id/groups", controllers.GetGroupsUser)
}

21
routes/groupe.go Normal file
View file

@ -0,0 +1,21 @@
package routes
import (
"cds/controllers"
"github.com/gofiber/fiber/v2"
)
func GroupRoute(route fiber.Router) {
route.Get("/:id", controllers.GetInfos)
route.Get("/:id/events", controllers.GetEvents)
route.Put("/create", controllers.CreateGroup)
route.Put("/join", controllers.JoinGroup)
route.Put("/leave", controllers.LeaveGroupe)
route.Put("/switch", controllers.ChangeLeader)
route.Put("/events/plan", controllers.CreateEvent)
route.Put("/events/change", controllers.ChangeEvent)
route.Put("/end", controllers.EndGroup)
route.Delete("/cancel", controllers.DeleteGroup)
route.Delete("/events/cancel", controllers.DeleteEvent)
}