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  }