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
|
||||
|
||||
* .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
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/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
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