github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/sondages/sondages.go (about) 1 package sondages 2 3 import ( 4 "errors" 5 "fmt" 6 "sort" 7 "strconv" 8 "strings" 9 10 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 11 "github.com/benoitkugler/goACVE/server/core/rawdata/composites" 12 "github.com/benoitkugler/goACVE/server/core/utils/mails" 13 "github.com/benoitkugler/goACVE/logs" 14 "github.com/benoitkugler/goACVE/server/shared" 15 "github.com/labstack/echo" 16 ) 17 18 const ( 19 EndpointSondages = "/sondages/:key" 20 21 mailGestionSondage = "commentaires@acve.asso.fr" 22 23 bodyMail = `Bonjour, <br/> 24 Un avis sur le séjour %s vient d'être enregistré (ou modifié). 25 %s <br/><br/> 26 Plus de détails sont <a href="%s">disponibles ici</a>. <br/> 27 A bientôt ! 28 ` // labelSejour, messages, urlSondages 29 ) 30 31 type Controller struct { 32 shared.Controller 33 } 34 35 func PageSondages(c echo.Context) error { 36 return c.File("server/static/bv/sondages.html") 37 } 38 39 func (ct Controller) LoadSondages(c echo.Context) error { 40 key := c.Param("key") 41 if key != logs.KeyAdminSondages { 42 return errors.New("La clé d'accès est incorrecte.") 43 } 44 45 rows, err := ct.DB.Query("SELECT camps.* FROM camps JOIN sondages ON sondages.id_camp = camps.id") 46 if err != nil { 47 return err 48 } 49 camps, err := rd.ScanCamps(rows) 50 if err != nil { 51 return err 52 } 53 rows, err = ct.DB.Query(`SELECT sondages.*, factures.*, personnes.* FROM sondages 54 JOIN factures ON sondages.id_facture = factures.id 55 JOIN personnes ON factures.id_personne = personnes.id`) 56 if err != nil { 57 return err 58 } 59 sondages, err := composites.ScanSondageFacturePersonnes(rows) 60 if err != nil { 61 return err 62 } 63 out := make([]SondageDetails, len(sondages)) 64 for i, sondage := range sondages { 65 out[i].Sondage = sondage.Sondage 66 out[i].Responsable = sondage.Personne.NomPrenom().String() 67 out[i].Mail = sondage.Personne.Mail.String() 68 out[i].Camp = camps[sondage.IdCamp].Label().String() 69 } 70 sort.Slice(out, func(i, j int) bool { 71 return out[i].Modified.After(out[j].Modified) 72 }) 73 return c.JSON(200, out) 74 } 75 76 // Notifie envoie un mail sur ajout ou création d'une réponse 77 // à un sondage. 78 func (ct Controller) Notifie(host string, sondage rd.Sondage) error { 79 camp, err := rd.SelectCamp(ct.DB, sondage.IdCamp) 80 if err != nil { 81 return err 82 } 83 84 var messages string 85 if me := sondage.MessageEnfant.TrimSpace().String(); me != "" { 86 me = strings.Join(strings.Split(me, "\n"), "<br/>") 87 messages += "<br/><br/><b>Retour d'un participant :</b> <br/>" + me 88 } 89 if me := sondage.MessageResponsable.TrimSpace().String(); me != "" { 90 me = strings.Join(strings.Split(me, "\n"), "<br/>") 91 messages += "<br/><br/><b>Retour du responsable : </b><br/>" + me 92 } 93 lien := shared.BuildUrl(host, strings.Replace(EndpointSondages, ":key", logs.KeyAdminSondages, -1), map[string]string{"id": strconv.Itoa(int(sondage.Id))}) 94 body := fmt.Sprintf(bodyMail, camp.Label(), messages, lien) 95 96 err = mails.NewMailer(ct.SMTP).SendMail(mailGestionSondage, "[ACVE] Nouvel avis", body, nil, nil) 97 return err 98 }