github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/misc/lien_espace_perso.go (about) 1 package misc 2 3 import ( 4 "strings" 5 6 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 7 "github.com/benoitkugler/goACVE/server/core/rawdata/composites" 8 "github.com/benoitkugler/goACVE/server/core/utils/mails" 9 "github.com/benoitkugler/goACVE/server/shared" 10 "github.com/labstack/echo" 11 ) 12 13 type Controller struct { 14 shared.Controller 15 } 16 17 func (ct Controller) SearchMail(c echo.Context) error { 18 var params SearchMailIn 19 if err := c.Bind(¶ms); err != nil { 20 return err 21 } 22 res, err := ct.searchMail(c.Request().Host, params) 23 if err != nil { 24 return err 25 } 26 out := SearchMailOut{Found: len(res) > 0} 27 if out.Found { 28 body, err := mails.NewRenvoieLienEspacePerso(params.Mail, res) 29 if err != nil { 30 return shared.FormatErr("Votre adresse est présente, mais l'envoi du lien par mail a échoué.", err) 31 } 32 err = mails.NewMailer(ct.SMTP).SendMail(params.Mail, "[ACVE] Espace de suivi", body, nil, nil) 33 if err != nil { 34 return shared.FormatErr("Votre adresse est présente, mais l'envoi du lien par mail a échoué.", err) 35 } 36 } 37 return c.JSON(200, out) 38 } 39 40 func (ct Controller) searchMail(host string, params SearchMailIn) ([]mails.ResumeDossier, error) { 41 if strings.TrimSpace(params.Mail) == "" { 42 return nil, nil 43 } 44 45 rows, err := ct.DB.Query(`SELECT factures.*, personnes.* FROM factures 46 JOIN personnes ON personnes.id = factures.id_personne 47 WHERE personnes.mail = $1`, params.Mail) 48 if err != nil { 49 return nil, err 50 } 51 factures, err := composites.ScanFacturePersonnes(rows) 52 if err != nil { 53 return nil, err 54 } 55 56 var idFactures rd.Ids 57 for _, fac := range factures { 58 idFactures = append(idFactures, fac.Facture.Id) 59 } 60 61 rows, err = ct.DB.Query(`SELECT participants.*, camps.* FROM participants 62 JOIN camps ON participants.id_camp = camps.id 63 WHERE participants.id_facture = ANY($1)`, idFactures.AsSQL()) 64 if err != nil { 65 return nil, err 66 } 67 participants, err := composites.ScanParticipantCamps(rows) 68 if err != nil { 69 return nil, err 70 } 71 72 var out []mails.ResumeDossier 73 for _, facture := range factures { 74 lien := shared.BuildUrl(host, facture.Facture.UrlEspacePerso("espace_perso"), nil) 75 res := mails.ResumeDossier{Responsable: facture.BasePersonne, CampsMap: rd.Camps{}, Lien: lien} 76 for _, participant := range participants { 77 if participant.IdFacture.Is(facture.Facture.Id) { 78 res.CampsMap[participant.IdCamp] = participant.Camp 79 } 80 } 81 out = append(out, res) 82 } 83 return out, nil 84 }