github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/main.go (about) 1 package main 2 3 // TODO: dons: ajout rechercehe + switch organism/persone + switch anéee + montant total 4 // TODO: enlever don annonymes (inutiles) 5 6 // virement ; accés de la banque par marie pierre 7 // paiement en ligne : accés compta pour basculer les sommes 8 // dons : accès marie-pierre, jean-pierre barbe 9 // dons; ajouter champ libre numéro 10 // TODO: recus fiscaux attention à la performance 11 12 // TODO: ajouter notifications direct sur paiement par mail 13 // TODO: paiement en plusieurs fois (autoriser une somme plus faible) 14 15 // TODO: (Moyen terme) Joomeo : message personnalisé 16 // TODO: (Moyen terme) mails pour relance fiche sanitaire (en cc) 17 import ( 18 "database/sql" 19 "encoding/json" 20 "errors" 21 "flag" 22 "fmt" 23 "log" 24 "net/http" 25 "os" 26 "strings" 27 28 "os/exec" 29 "path" 30 "strconv" 31 "time" 32 33 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 34 35 "github.com/benoitkugler/goACVE/server/acvegestion" 36 "github.com/benoitkugler/goACVE/server/directeurs" 37 "github.com/benoitkugler/goACVE/server/documents" 38 "github.com/benoitkugler/goACVE/server/equipier" 39 "github.com/benoitkugler/goACVE/server/espaceperso" 40 "github.com/benoitkugler/goACVE/server/inscriptions" 41 "github.com/benoitkugler/goACVE/server/misc" 42 "github.com/benoitkugler/goACVE/server/passwords" 43 "github.com/benoitkugler/goACVE/server/shared" 44 "github.com/benoitkugler/goACVE/server/sondages" 45 "github.com/benoitkugler/goACVE/server/vote" 46 47 "github.com/benoitkugler/goACVE/server/core/apiserver" 48 49 "github.com/benoitkugler/goACVE/logs" 50 cd "github.com/benoitkugler/goACVE/server/core/documents" 51 "github.com/benoitkugler/goACVE/server/core/utils/mails" 52 "github.com/benoitkugler/goACVE/server/core/utils/pdf" 53 54 "github.com/labstack/echo" 55 "github.com/labstack/echo/middleware" 56 ) 57 58 const ( 59 urlACVEGestion = "/ACVEGestion/api/" 60 61 urlCleanupTmpDocuments = "/api/admin/cleanup_tmp_docs" 62 ) 63 64 func initDB(dev bool) *sql.DB { 65 var ( 66 db *sql.DB 67 err error 68 ) 69 if dev { 70 db, err = rd.ConnectDB(logs.DBDev) 71 logSetup(err, dev, "DB dev") 72 } else { 73 db, err = rd.ConnectDB(logs.DBProd) 74 logSetup(err, dev, "DB production") 75 } 76 return db 77 } 78 79 func parseFlags() (dev, dry bool) { 80 devPtr := flag.Bool("dev", false, "utilise les crédences de développement") 81 dryPtr := flag.Bool("dry", false, "vérifie les connections et quite") 82 flag.Parse() 83 return *devPtr, *dryPtr 84 } 85 86 func logSetup(err error, dev bool, label string) { 87 if err != nil { 88 if dev { 89 log.Println(label, "error :", err) 90 } else { 91 log.Fatal(label, "error :", err) 92 } 93 } else { 94 fmt.Println(label, "--> OK") 95 } 96 } 97 98 func checks(db *sql.DB, dev bool) { 99 // si les DB sont nils, en mode production 100 // on s'arrête avant 101 if db != nil { 102 err := db.Ping() 103 logSetup(err, dev, "Ping DB") 104 } 105 106 err := exec.Command("gs", "--version").Run() 107 logSetup(err, dev, "Ghostscript") 108 109 urlWeasyprint, err := pdf.TestWeasyprint() 110 logSetup(err, dev, "Server weasyprint "+urlWeasyprint) 111 112 err = cd.TestRIB() 113 logSetup(err, dev, "RIB") 114 115 err = pdf.CheckPdfToolkit() 116 logSetup(err, dev, "PdfToolkit") 117 } 118 119 func getAdress(dev bool) string { 120 var adress string 121 if dev { 122 adress = "localhost:1323" 123 } else { 124 // alwaysdata use IP and PORT env var 125 host := os.Getenv("IP") 126 port, err := strconv.Atoi(os.Getenv("PORT")) 127 if err != nil { 128 log.Fatal("No PORT found", err) 129 } 130 if strings.Count(host, ":") >= 2 { // ipV6 -> besoin de crochet 131 host = "[" + host + "]" 132 } 133 adress = fmt.Sprintf("%s:%d", host, port) 134 } 135 return adress 136 } 137 138 func setDevMode(e *echo.Echo, ct directeurs.Controller) { 139 fmt.Println("Dev mode :") 140 e.Use(middleware.CORSWithConfig(middleware.CORSConfig{ 141 AllowMethods: append(middleware.DefaultCORSConfig.AllowMethods, http.MethodOptions), 142 AllowHeaders: []string{"Authorization", "Content-Type", "Access-Control-Allow-Origin"}, 143 ExposeHeaders: []string{"Content-Disposition"}, 144 })) 145 fmt.Println("\tCORS activé.") 146 147 e.GET("test/error", func(c echo.Context) error { 148 return shared.RedirectError(c, errors.New("erreur de test. <br/> Détails : <i>dssdmsldkmslk</i>")) 149 }, shared.RedirectIE11) 150 e.GET("test/success", func(c echo.Context) error { 151 return shared.RedirectSuccess(c, "Validation", "Mail validé", "Mail validé. <br/> <b>Merci !</b>") 152 }, shared.RedirectIE11) 153 154 e.GET("test/success", func(c echo.Context) error { 155 return shared.RedirectSuccess(c, "Validation", "Mail validé", "Mail validé. <br/> <b>Merci !</b>") 156 }, shared.RedirectIE11) 157 158 e.GET("/test/stream", func(c echo.Context) error { 159 c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSON) 160 c.Response().WriteHeader(http.StatusOK) 161 enc := json.NewEncoder(c.Response()) 162 for range [20]byte{} { 163 if err := enc.Encode("ldslmksml"); err != nil { 164 return err 165 } 166 c.Response().Flush() 167 time.Sleep(500 * time.Millisecond) 168 } 169 return nil 170 }) 171 172 e.GET("test/routes", func(c echo.Context) error { 173 return c.JSONPretty(200, e.Routes(), " ") 174 }) 175 fmt.Println("\tRoutes /test/... setup") 176 token, err := ct.ShowTokenDev() 177 if err != nil { 178 log.Fatal(err) 179 } 180 fmt.Println("\t" + token) 181 } 182 183 func main() { 184 dev, dry := parseFlags() 185 186 e := echo.New() 187 188 e.HTTPErrorHandler = func(err error, c echo.Context) { 189 err = echo.NewHTTPError(400, err.Error()) 190 e.DefaultHTTPErrorHandler(err, c) 191 } 192 193 // on se connecte sur la bonne base de donnée 194 db := initDB(dev) 195 defer db.Close() 196 197 e.Group("/static", middleware.Gzip(), shared.CacheStatic).Static("/*", "server/static") 198 199 // on ajuste les crédences 200 logsStmp, logsJoomeo, signing := logs.SmtpProd, logs.JoomeoProd, logs.PASSPHRASE 201 if dev { 202 logsStmp, logsJoomeo, signing = logs.SmtpDev, logs.JoomeoDev, logs.PASSPHRASE_DEV 203 } 204 205 // on crée les controllers 206 basic := shared.Controller{SMTP: logsStmp, DB: db, Signing: signing} 207 208 ctMisc := misc.Controller{Controller: basic} 209 ctSondages := sondages.Controller{Controller: basic} 210 ctDocuments := documents.Controller{Controller: basic} 211 ctPageEquipier := equipier.NewController(basic, logsJoomeo) 212 213 ctEspacePerso, err := espaceperso.NewController(basic, logsJoomeo, ctSondages) 214 if err != nil { 215 log.Fatalf("can't init espace perso : %s", err) 216 } 217 218 ctDirecteurs, err := directeurs.NewController(basic, logsJoomeo, "ressources/") 219 if err != nil { 220 log.Fatalf("can't init directeurs : %s", err) 221 } 222 223 ctAcvegestion := acvegestion.Controller{Controller: basic, FicheSanitaireNotifier: ctEspacePerso, ContraintesEquipiers: ctDirecteurs.ContraintesEquipiers} 224 225 ctInscriptions := inscriptions.Controller{Controller: basic} 226 227 ctVote, err := vote.NewController(basic.DB, basic.SMTP, ".") 228 if err != nil { 229 log.Fatalf("can't init votes : %s", err) 230 231 } 232 ctPasswords := passwords.Controller{DB: basic.DB} 233 234 if dev { 235 setDevMode(e, ctDirecteurs) 236 } 237 238 setupRoutesACVEGestion(e, ctAcvegestion) 239 setupRoutesDirecteurs(e, ctDirecteurs) 240 setupRoutesMisc(e, ctMisc, ctSondages) 241 setupRoutesDocuments(e, ctDocuments) 242 setupRoutesInscriptions(e, ctInscriptions) 243 setupRoutesEspacePerso(e, ctEspacePerso) 244 setupRoutesEquipier(e, ctPageEquipier) 245 setupRoutesVote(e, ctVote) 246 setupRoutesPasswords(e, ctPasswords) 247 248 mails.InitTemplates("ressources/") 249 logSetup(nil, dev, "Templates mails") 250 251 err = pdf.InitImages() 252 logSetup(err, dev, "Images") 253 254 if dry { 255 checks(db, dev) 256 fmt.Println("Setup done. Exiting.") 257 return 258 } else { 259 // on lance la vérification dans une goroutine 260 // pour ne pas retarder le lancement principal 261 go checks(db, dev) 262 263 adress := getAdress(dev) 264 log.Println("Setup done. Listening...") 265 e.Logger.Fatal(e.Start(adress)) 266 } 267 } 268 269 func setupRoutesDirecteurs(e *echo.Echo, ct directeurs.Controller) { 270 for _, route := range []string{ 271 "/directeurs/inscrits", 272 "/directeurs/equipe", 273 "/directeurs/lettre_directeur", 274 "/directeurs/liste_vetements", 275 "/directeurs/details", 276 "/directeurs/photos", 277 "/directeurs/retours", 278 "/directeurs/", 279 "/directeurs", 280 "/directeurs/home", 281 } { 282 e.GET(route, directeurs.Accueil, shared.NoCache) 283 } 284 285 p := func(s string) string { 286 return path.Join(directeurs.UrlApiDirecteurs, s) 287 } 288 e.GET(p("identification"), ct.DataLoggin) 289 e.POST(p("identification"), ct.Loggin) 290 291 e.GET(p("details/:categorie"), ct.GetDetails) 292 e.POST(p("details/:categorie"), ct.UpdateDetails) 293 e.PUT(p("details/document"), ct.AjouteBonusDoc) 294 295 e.GET(p("inscrits"), ct.GetInscrits) 296 e.POST(p("inscrits"), ct.UpdateInscrit) 297 298 e.GET(p("contraintes"), ct.LoadContraintes) 299 e.PUT(p("contraintes"), ct.CreateContrainte) 300 e.POST(p("contraintes"), ct.UpdateContrainte) 301 e.DELETE(p("contraintes"), ct.DeleteContrainte) 302 e.GET(p("contraintes/lie_document"), ct.LieDocument) 303 304 e.GET(p("groupes"), ct.LoadGroupes) 305 e.PUT(p("groupes"), ct.CreateGroupe) 306 e.POST(p("groupes"), ct.UpdateGroupe) 307 e.DELETE(p("groupes"), ct.DeleteGroupe) 308 e.POST(p("groupes/plages"), ct.UpdatePlages) 309 310 e.GET(p("groupes/animateurs"), ct.LoadGroupeAnimateurs) 311 e.PUT(p("groupes/animateurs"), ct.AddGroupeAnimateurs) 312 e.POST(p("groupes/animateurs"), ct.DeleteGroupeAnimateur) 313 e.POST(p("groupes/animateurs/inscrits"), ct.UpdateInscritsAnimateur) 314 e.PUT(p("groupes/animateurs/inscrits"), ct.AutoRepartitInscritsAnimateur) 315 316 e.POST(p("groupes/contraintes"), ct.UpdateGroupesContraintes) 317 318 e.GET(p("inscrits/documents"), ct.PreviewDocumentInscrits) 319 e.POST(p("inscrits/documents"), ct.DownloadDocumentInscrits) 320 e.POST(p("inscrits/fiche_sanitaire"), ct.DownloadFicheSanitaire) 321 322 e.GET(p("equipe/pieces"), ct.GetDocumentsEquipe) 323 e.POST(p("equipe/pieces"), ct.SetDocumentsEquipe) 324 e.GET(p("equipe/pieces/download"), ct.DownloadDocumentsEquipe) 325 e.PUT(p("equipe/pieces/upload"), ct.AddDocumentEquipe) 326 327 e.POST(p("equipe/recherche"), ct.RechercheProfil) 328 329 e.GET(p("equipe"), ct.GetEquipe) 330 e.PUT(p("equipe"), ct.AddEquipier) 331 e.POST(p("equipe"), ct.ModifieEquipier) 332 e.DELETE(p("equipe"), ct.DeleteEquipier) 333 e.POST(p("equipe/invite"), ct.InviteFormulaireEquipier) 334 335 e.GET(p("exports/:categorie"), ct.ExportsExcel) 336 337 e.GET(p("liste_vetements/:default"), ct.GetListeVetements) 338 e.POST(p("liste_vetements"), ct.UpdateListeVetements) 339 e.GET(p("liste_vetements/preview"), ct.PreviewListeVetements) 340 341 e.GET(p("lettre_directeur"), ct.GetLettreDirecteur) 342 e.POST(p("lettre_directeur"), ct.UpdateLettreDirecteur) 343 e.POST(p("lettre_directeur/upload_image/:id_camp/:token"), ct.UploadImageLettre) 344 e.GET(directeurs.PATH_LOAD_IMAGES_LETTRE, ct.LoadImageLettre) 345 346 e.GET(p("photos"), ct.GetJoomeo) 347 e.PUT(p("photos"), ct.AddContactsJoomeo) 348 e.POST(p("photos"), ct.SetContactUploader) 349 e.DELETE(p("photos"), ct.DeleteContact) 350 351 e.GET(p("retours"), ct.LoadSondages) 352 } 353 354 func setupRoutesMisc(e *echo.Echo, ct misc.Controller, ct2 sondages.Controller) { 355 // accueil général 356 e.GET("/", func(c echo.Context) error { 357 return c.File("server/static/bv/accueil.html") 358 }) 359 360 // cgu 361 e.GET("/cgu", func(c echo.Context) error { 362 return c.File("server/static/bv/cgu.html") 363 }) 364 365 e.GET("/logiciel", misc.HandleLogiciel) 366 e.POST("/logiciel", misc.DownloadLogiciel) 367 368 // Hello Asso 369 e.POST("/helloasso/nouveau_paiement", func(c echo.Context) error { 370 c.Logger().Printf("HELLOASSO - Notification") 371 return c.NoContent(200) 372 }) 373 374 // vue globale des sondages 375 e.GET(sondages.EndpointSondages, sondages.PageSondages) 376 e.POST(sondages.EndpointSondages, ct2.LoadSondages) 377 378 // url de nettoyage des documents temporaires 379 e.GET(urlCleanupTmpDocuments, ct.Controller.CleanupTmpDocuments) 380 381 // url de récupération du lien de suivi 382 e.POST("/lien_espace_perso", ct.SearchMail) 383 } 384 385 func setupRoutesDocuments(e *echo.Echo, ct documents.Controller) { 386 e.GET(documents.EndPointMiniature, ct.SertMiniature) 387 e.GET(documents.EndPointDocument, ct.SertDocument) 388 e.POST(documents.EndPointDocument, ct.HandleUpload) 389 e.DELETE(documents.EndPointDocument, ct.HandleDelete) 390 } 391 392 func setupRoutesInscriptions(e *echo.Echo, ct inscriptions.Controller) { 393 p := func(s string) string { 394 return path.Join(inscriptions.UrlInscriptions, s) 395 } 396 397 e.GET(p(""), ct.FormulaireInscription, middleware.Gzip(), shared.RedirectIE11, shared.NoCache) 398 e.GET(p("/:preselected"), ct.FormulaireInscription, middleware.Gzip(), shared.RedirectIE11, shared.NoCache) 399 400 e.GET(p("/api"), ct.HandleLoadDataInscriptions) 401 e.POST(p("/api"), ct.EnregistreInscriptionComplete) 402 e.POST(p("/api/no-check-mail"), ct.RejoueInscriptionComplete) 403 e.GET(p("/api/check-mail"), ct.CheckMail) 404 405 e.GET(p(inscriptions.EndPointValidMail), ct.ValideMail) 406 407 e.POST(p("/api/simple"), ct.EnregistreInscriptionSimple) 408 } 409 410 func setupRoutesEspacePerso(e *echo.Echo, ct espaceperso.Controller) { 411 for _, route := range []string{ 412 "/espace_perso/:key", 413 "/espace_perso/", 414 "/espace_perso", 415 "/espace_perso/:key/participants", 416 "/espace_perso/:key/paiement", 417 "/espace_perso/:key/documents", 418 "/espace_perso/:key/fiches_sanitaires", 419 "/espace_perso/:key/joomeo", 420 "/espace_perso/:key/retours", 421 } { 422 e.GET(route, espaceperso.Accueil, middleware.Gzip(), shared.RedirectIE11, shared.NoCache) 423 } 424 425 e.GET("/espace_perso/:key/api/metas", ct.GetMetas) 426 e.GET("/espace_perso/:key/api/datas", ct.GetData) 427 e.GET("/espace_perso/:key/api/finances", ct.GetFinances) 428 e.GET("/espace_perso/:key/api/joomeo", ct.LoadJoomeo) 429 430 e.PUT("/espace_perso/:key/api/document", ct.CreateDocument) 431 e.PUT("/espace_perso/:key/api/aide", ct.CreateAide) 432 e.POST("/espace_perso/:key/api/aide", ct.UpdateAide) 433 e.DELETE("/espace_perso/:key/api/aide", ct.DeleteAide) 434 e.GET("/espace_perso/:key/api/fiche_sanitaire", ct.TransfertFicheSanitaire) 435 e.POST("/espace_perso/:key/api/fiche_sanitaire", ct.UpdateFicheSanitaire) 436 e.POST("/espace_perso/:key/api/participants", ct.UpdateOptionsParticipants) 437 438 e.GET(espaceperso.EndPointPartageFicheSanitaire, ct.ValideTransfertFicheSanitaire) 439 440 e.GET("/espace_perso/:key/api/connected", ct.MarkConnection) 441 442 e.GET("/espace_perso/:key/api/download/facture", ct.DownloadFacture) 443 e.GET("/espace_perso/:key/api/download/presence", ct.DownloadAttestationPresence) 444 445 e.POST("/espace_perso/:key/api/sondage", ct.SaveSondage) 446 447 e.PUT("/espace_perso/:key/api/message", ct.CreeMessage) 448 e.POST("/espace_perso/:key/api/message", ct.EditMessage) 449 e.DELETE("/espace_perso/:key/api/message", ct.DeleteMessage) 450 451 e.POST("/espace_perso/:key/api/placeliberee", ct.ConfirmePlaceliberee) 452 } 453 454 func setupRoutesEquipier(e *echo.Echo, ct equipier.Controller) { 455 p := func(s string) string { 456 return path.Join(directeurs.EndPointEquipier, s) 457 } 458 459 e.GET(p("/:cryptedId"), equipier.FormulaireEquipier, middleware.Gzip(), shared.RedirectIE11, shared.NoCache) 460 461 e.GET(p("/:cryptedId/datas"), ct.DatasEquipier) 462 e.GET(p("/:cryptedId/datas/joomeo"), ct.DatasJoomeo) 463 e.POST(p("/:cryptedId"), ct.UpdateEquipier) 464 e.PUT(p("/:cryptedId"), ct.AjouteDocumentEquipier) 465 466 e.POST(p("/:cryptedId/charte"), ct.UpdateCharte) 467 } 468 469 func setupRoutesACVEGestion(e *echo.Echo, ct acvegestion.Controller) { 470 p := func(s string) string { 471 return path.Join(urlACVEGestion, s) 472 } 473 474 e.GET(p(apiserver.UrlUpdate+"/:platform"), acvegestion.SertUpdateInfos) 475 e.POST(p(apiserver.UrlUpdate+"/:platform"), acvegestion.SertUpdate) 476 477 e.GET(p(apiserver.UrlUsers), ct.GetUsers) 478 e.POST(p(apiserver.UrlUsers), ct.CheckPassword) 479 480 e.GET(p(apiserver.UrlDB), ct.SertDB) 481 e.PUT(p(apiserver.UrlDB), ct.SertDBHash) 482 e.POST(p(apiserver.UrlDB), ct.SertDBPartiel) 483 484 e.PUT(p(apiserver.UrlAides), ct.CreateAide) 485 e.POST(p(apiserver.UrlAides), ct.UpdateAide) 486 e.DELETE(p(apiserver.UrlAides), ct.DeleteAide) 487 488 e.PUT(p(apiserver.UrlPersonnes), ct.CreatePersonne) 489 e.POST(p(apiserver.UrlPersonnes), ct.UpdatePersonne) 490 e.DELETE(p(apiserver.UrlPersonnes), ct.DeletePersonne) 491 492 e.PUT(p(apiserver.UrlOrganismes), ct.CreateOrganisme) 493 e.POST(p(apiserver.UrlOrganismes), ct.UpdateOrganisme) 494 e.DELETE(p(apiserver.UrlOrganismes), ct.DeleteOrganisme) 495 496 e.POST(p(apiserver.UrlCamps), ct.UpdateCamp) 497 e.PUT(p(apiserver.UrlCamps), ct.CreateCamp) 498 e.DELETE(p(apiserver.UrlCamps), ct.DeleteCamp) 499 500 e.PUT(p(apiserver.UrlDons), ct.CreateDon) 501 e.POST(p(apiserver.UrlDons), ct.UpdateDon) 502 e.DELETE(p(apiserver.UrlDons), ct.DeleteDon) 503 e.POST(p(apiserver.UrlRecuFiscal), ct.GenereRecuFiscal) 504 e.GET(p(apiserver.UrlDonsHelloasso), ct.ImportDonsHelloasso) 505 e.POST(p(apiserver.UrlDonsHelloasso), ct.IdentifieDonHelloasso) 506 507 e.PUT(p(apiserver.UrlFactures), ct.CreateFacture) 508 e.POST(p(apiserver.UrlFactures), ct.UpdateFacture) 509 e.DELETE(p(apiserver.UrlFactures), ct.DeleteFacture) 510 e.POST(p(apiserver.UrlFacturesFusion), ct.FusionneFactures) 511 512 e.GET(p(apiserver.UrlInscriptions), ct.LoadInscriptions) 513 e.DELETE(p(apiserver.UrlInscriptions), ct.DeleteInscription) 514 e.POST(p(apiserver.UrlValideInscriptions), ct.ValideInscription) 515 516 e.PUT(p(apiserver.UrlIdentifieEquipier), ct.IdentifieEquipier) 517 e.PUT(p(apiserver.UrlIdentifieResponsable), ct.IdentifieResponsable) 518 e.PUT(p(apiserver.UrlIdentifieParticipant), ct.IdentifieParticipant) 519 e.PUT(p(apiserver.UrlIdentifieParticipantsimple), ct.IdentifieParticipantsimple) 520 521 e.PUT(p(apiserver.UrlPaiements), ct.CreatePaiement) 522 e.POST(p(apiserver.UrlPaiements), ct.UpdatePaiement) 523 e.DELETE(p(apiserver.UrlPaiements), ct.DeletePaiement) 524 e.POST(p(apiserver.UrlPaiementsBordereau), ct.MarquePaiementsBordereau) 525 526 e.PUT(p(apiserver.UrlParticipants), ct.CreateParticipant) 527 e.POST(p(apiserver.UrlParticipants), ct.UpdateParticipant) 528 e.DELETE(p(apiserver.UrlParticipants), ct.DeleteParticipant) 529 530 e.PUT(p(apiserver.UrlParticipantsimples), ct.CreateParticipantsimple) 531 e.POST(p(apiserver.UrlParticipantsimples), ct.UpdateParticipantsimple) 532 e.DELETE(p(apiserver.UrlParticipantsimples), ct.DeleteParticipantsimple) 533 534 e.PUT(p(apiserver.UrlStructureaides), ct.CreateStructureaide) 535 e.POST(p(apiserver.UrlStructureaides), ct.UpdateStructureaide) 536 e.DELETE(p(apiserver.UrlStructureaides), ct.DeleteStructureaide) 537 538 e.PUT(p(apiserver.UrlEquipiers), ct.CreateEquipier) 539 e.POST(p(apiserver.UrlEquipiers), ct.UpdateEquipier) 540 e.DELETE(p(apiserver.UrlEquipiers), ct.DeleteEquipier) 541 542 e.PUT(p(apiserver.UrlDocuments), ct.CreateDocument) 543 e.POST(p(apiserver.UrlDocuments), ct.UpdateDocument) 544 e.DELETE(p(apiserver.UrlDocuments), ct.DeleteDocument) 545 e.POST(p(apiserver.UrlDocumentsMiniatures), ct.GetDocumentsMiniatures) 546 e.GET(p(apiserver.UrlDocumentsTransfert), ct.DownloadDocument) 547 e.POST(p(apiserver.UrlDocumentsTransfert), ct.UploadDocument) 548 549 e.POST(p(apiserver.UrlNotifieMessage), ct.NotifieSimple) 550 551 e.PUT(p(apiserver.UrlNotifieMessagePerso), ct.NotifieMessage) 552 e.POST(p(apiserver.UrlNotifieMessagePerso), ct.EditMessage) 553 e.POST(p(apiserver.UrlMessages), ct.UpdateMessage) 554 e.PUT(p(apiserver.UrlMessages), ct.CreateMessageMessage) 555 556 e.POST(p(apiserver.UrlDeleteMessages), ct.DeleteMessages) 557 558 e.POST(p(apiserver.UrlNotifiePlaceLiberee), ct.NotifiePlaceLiberee) 559 e.POST(p(apiserver.UrlNotifieAttestation), ct.NotifieAttestation) 560 e.POST(p(apiserver.UrlNotifieMessagePersos), ct.NotifieMany) 561 e.POST(p(apiserver.UrlNotifieDocuments), ct.NotifieDocuments) 562 e.POST(p(apiserver.UrlNotifieSondages), ct.NotifieSondages) 563 } 564 565 func setupRoutesVote(e *echo.Echo, ct vote.Controller) { 566 e.GET("/vote_admin/:key", vote.PageAdmin, shared.NoCache) 567 568 e.GET("/vote_admin/:key/api/membres", ct.GetMembres) 569 e.PUT("/vote_admin/:key/api/membres", ct.InviteOne) 570 e.POST("/vote_admin/:key/api/membres", ct.InviteAll) 571 572 e.GET("/vote_admin/:key/api/votes", ct.GetVotes) 573 e.PUT("/vote_admin/:key/api/votes", ct.CreateVote) 574 e.POST("/vote_admin/:key/api/votes", ct.UpdateVote) 575 e.DELETE("/vote_admin/:key/api/votes", ct.DeleteVote) 576 577 e.GET("/vote_admin/:key/api/votes/clear", ct.ClearVote) 578 e.POST("/vote_admin/:key/api/votes/lock", ct.LockVote) 579 e.GET("/vote_admin/:key/api/votes/export", ct.ExportBilanVotes) 580 581 e.GET(vote.EndpointVote+"/:key", ct.PageVote) 582 e.POST(vote.EndpointVote+"/:key", ct.LoadVotes) 583 e.PUT(vote.EndpointVote+"/:key", ct.EffectueVote) 584 e.DELETE(vote.EndpointVote+"/:key", ct.ResetVote) 585 e.GET(vote.EndpointVote+"/:key/export", ct.ExportBilanPersonne) 586 } 587 588 func setupRoutesPasswords(e *echo.Echo, ct passwords.Controller) { 589 e.GET("/passwords/:key", passwords.PagePasswords, shared.NoCache) 590 591 e.GET("/passwords/:key/api", ct.GetPasswords) 592 e.PUT("/passwords/:key/api", ct.CreatePassword) 593 e.POST("/passwords/:key/api", ct.UpdatePassword) 594 e.DELETE("/passwords/:key/api", ct.DeletePassword) 595 }