feat(API): add API
This commit is contained in:
parent
220611a563
commit
29472384da
7 changed files with 340 additions and 9 deletions
15
README.md
15
README.md
|
@ -3,15 +3,30 @@
|
||||||
## Structure du projet
|
## Structure du projet
|
||||||
|
|
||||||
* .env : fichier de configuration
|
* .env : fichier de configuration
|
||||||
|
* controllers : actions possibles par l'API REST
|
||||||
|
* docs : doc swagger (swagger -i)
|
||||||
|
* routes : configuration des routes
|
||||||
* views : fichiers html dynamiques
|
* views : fichiers html dynamiques
|
||||||
* dao : fichiers pour faire des requetes en BDD
|
* dao : fichiers pour faire des requetes en BDD
|
||||||
* models : structures utilisées pour manipuler le contenu de la base de données
|
* models : structures utilisées pour manipuler le contenu de la base de données
|
||||||
|
|
||||||
## Lancement
|
## Lancement
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
Il faut mettre en place une base de données [MongoDB](https://www.mongodb.com/).
|
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/)
|
Il est nécessaire d'avoir [une application Discord](https://discord.com/developers/)
|
||||||
et [une clé d'API Steam](https://steamcommunity.com/dev).
|
et [une clé d'API Steam](https://steamcommunity.com/dev).
|
||||||
Configurez ensuite le fichier `example.env` et renommez le en `.env`.
|
Configurez ensuite le fichier `example.env` et renommez le en `.env`.
|
||||||
|
|
||||||
Lancez le serveur avec `go run main.go`.
|
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
169
controllers/group.go
Normal 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
105
controllers/user.go
Normal 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
7
controllers/utils.go
Normal 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
19
main.go
|
@ -4,14 +4,14 @@ import (
|
||||||
"cds/controllers"
|
"cds/controllers"
|
||||||
"cds/dao"
|
"cds/dao"
|
||||||
"cds/models"
|
"cds/models"
|
||||||
|
"cds/routes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"time"
|
|
||||||
|
|
||||||
_ "cds/docs"
|
_ "cds/docs"
|
||||||
|
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
"github.com/gofiber/template/django"
|
"github.com/gofiber/swagger"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"github.com/markbates/goth"
|
"github.com/markbates/goth"
|
||||||
"github.com/markbates/goth/providers/discord"
|
"github.com/markbates/goth/providers/discord"
|
||||||
|
@ -23,12 +23,11 @@ import (
|
||||||
//const DISCORD_API = "https://discord.com/api/v10/"
|
//const DISCORD_API = "https://discord.com/api/v10/"
|
||||||
|
|
||||||
func setupRoutes(app *fiber.App) {
|
func setupRoutes(app *fiber.App) {
|
||||||
app.Get("/", index)
|
//app.Get("/", index)
|
||||||
|
api := app.Group("/api")
|
||||||
//api := app.Group("/api")
|
routes.GroupRoute(api.Group("/groups"))
|
||||||
//routes.AccountRoute(api.Group("/accounts"))
|
routes.UserRoute(api.Group("/users"))
|
||||||
//routes.GroupeRoute(api.Group("/groups"))
|
app.Get("/swagger/*", swagger.HandlerDefault)
|
||||||
//app.Get("/swagger/*", swagger.HandlerDefault)
|
|
||||||
|
|
||||||
app.Get("/login/:provider", goth_fiber.BeginAuthHandler)
|
app.Get("/login/:provider", goth_fiber.BeginAuthHandler)
|
||||||
app.Get("/auth/:provider", controllers.Auth)
|
app.Get("/auth/:provider", controllers.Auth)
|
||||||
|
@ -98,7 +97,7 @@ func main() {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
app := fiber.New(fiber.Config{Views: django.New("./views", ".django")})
|
app := fiber.New()
|
||||||
goth.UseProviders(
|
goth.UseProviders(
|
||||||
discord.New(
|
discord.New(
|
||||||
os.Getenv("DISCORD_ID"),
|
os.Getenv("DISCORD_ID"),
|
||||||
|
@ -109,6 +108,8 @@ func main() {
|
||||||
)
|
)
|
||||||
|
|
||||||
setupRoutes(app)
|
setupRoutes(app)
|
||||||
|
app.Static("/", "./dist")
|
||||||
|
app.Static("/*", "./dist")
|
||||||
|
|
||||||
err = app.Listen(":8080")
|
err = app.Listen(":8080")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
13
routes/accounts.go
Normal file
13
routes/accounts.go
Normal 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
21
routes/groupe.go
Normal 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)
|
||||||
|
}
|
Loading…
Reference in a new issue