github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/equipier/controller.go (about) 1 // Implémente le formulaire équipier (informations, document, charte, ...) 2 package equipier 3 4 import ( 5 "sort" 6 7 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 8 "github.com/benoitkugler/goACVE/server/core/utils/joomeo" 9 "github.com/benoitkugler/goACVE/logs" 10 "github.com/benoitkugler/goACVE/server/documents" 11 "github.com/benoitkugler/goACVE/server/shared" 12 ) 13 14 type Controller struct { 15 shared.Controller 16 17 joomeo logs.Joomeo 18 } 19 20 func NewController(basic shared.Controller, joomeo logs.Joomeo) Controller { 21 return Controller{Controller: basic, joomeo: joomeo} 22 } 23 24 // fromPersonneEquipier prend aussi en compte le statut de l'invitation et de la charte 25 func fromPersonneEquipier(personne rd.Personne, equipier rd.Equipier) EquipierEquipier { 26 out := EquipierEquipier{shared.FromPersonneEquipier(personne, equipier)} 27 28 out.InvitationEquipier = equipier.InvitationEquipier 29 out.Charte = equipier.Charte 30 31 return out 32 } 33 34 func (eq EquipierEquipier) ToPersonneEquipier(personne *rd.BasePersonne, equipier *rd.Equipier) { 35 eq.BaseEquipier.ToPersonneEquipier(personne, equipier) 36 equipier.InvitationEquipier = eq.InvitationEquipier 37 equipier.Charte = eq.Charte 38 } 39 40 func (ct Controller) identifie(link string) (int64, error) { 41 return shared.DecodeID(ct.Signing, link, shared.OrEquipier) 42 } 43 44 func (ct Controller) loadData(host string, idEquipier int64) (datas DataEquipier, err error) { 45 equipier, err := rd.SelectEquipier(ct.DB, idEquipier) 46 if err != nil { 47 return 48 } 49 eqContraintes, err := rd.SelectEquipierContraintesByIdEquipiers(ct.DB, idEquipier) 50 if err != nil { 51 return 52 } 53 rows, err := ct.DB.Query(`SELECT contraintes.* FROM contraintes 54 JOIN equipier_contraintes ON equipier_contraintes.id_contrainte = contraintes.id 55 WHERE equipier_contraintes.id_equipier = $1`, idEquipier) 56 if err != nil { 57 return 58 } 59 contraintes, err := rd.ScanContraintes(rows) 60 if err != nil { 61 return 62 } 63 personne, err := rd.SelectPersonne(ct.DB, equipier.IdPersonne) 64 if err != nil { 65 return 66 } 67 datas.Equipier = fromPersonneEquipier(personne, equipier) 68 69 camp, err := rd.SelectCamp(ct.DB, equipier.IdCamp) 70 if err != nil { 71 return 72 } 73 datas.Camp.From(camp) 74 75 docs, err := ct.LoadDocuments(rd.Ids{personne.Id}) 76 if err != nil { 77 return 78 } 79 80 // on regroupe les documents présents par contrainte 81 byContrainte := make(map[int64][]rd.Document) 82 for _, lien := range docs.Liens { 83 byContrainte[lien.IdContrainte] = append(byContrainte[lien.IdContrainte], docs.Documents[lien.IdDocument]) 84 } 85 86 // on publie les documents liés à chaque contraintes 87 for _, eqContrainte := range eqContraintes { 88 pubContrainte, err := documents.PublieContrainte(ct.Signing, ct.DB, host, contraintes[eqContrainte.IdContrainte]) 89 if err != nil { 90 return datas, err 91 } 92 cds := documents.ContrainteDocuments{Contrainte: pubContrainte} 93 for _, doc := range byContrainte[eqContrainte.IdContrainte] { 94 publicDoc, err := documents.PublieDocument(ct.Signing, host, doc) 95 if err != nil { 96 return datas, err 97 } 98 cds.Docs = append(cds.Docs, publicDoc) 99 } 100 101 datas.Pieces = append(datas.Pieces, ContrainteEquipier{ContrainteDocuments: cds, Optionnel: eqContrainte.Optionnel}) 102 } 103 sort.Slice(datas.Pieces, func(i, j int) bool { 104 return datas.Pieces[i].Contrainte.Nom < datas.Pieces[j].Contrainte.Nom 105 }) 106 return 107 } 108 109 func (ct Controller) updateEquipier(eq EquipierEquipier, idEquipier int64) (EquipierEquipier, error) { 110 tx, err := ct.DB.Begin() 111 if err != nil { 112 return eq, err 113 } 114 eq.InvitationEquipier = rd.Verifie 115 116 equipier, err := rd.SelectEquipier(tx, idEquipier) 117 if err != nil { 118 return eq, shared.Rollback(tx, err) 119 } 120 personne, err := rd.SelectPersonne(tx, equipier.IdPersonne) 121 if err != nil { 122 return eq, shared.Rollback(tx, err) 123 } 124 125 eq.ToPersonneEquipier(&personne.BasePersonne, &equipier) 126 127 personne, err = personne.Update(tx) 128 if err != nil { 129 return eq, shared.Rollback(tx, err) 130 } 131 equipier, err = equipier.Update(tx) 132 if err != nil { 133 return eq, shared.Rollback(tx, err) 134 } 135 136 return fromPersonneEquipier(personne, equipier), tx.Commit() // mis à jour en retour 137 } 138 139 func (ct Controller) updateCharte(idEquipier int64, charte rd.OptionnalBool) error { 140 _, err := ct.DB.Exec("UPDATE equipiers SET charte = $1 WHERE id = $2", charte, idEquipier) 141 return err 142 } 143 144 func (ct Controller) loadJoomeo(idEquipier int64) (DatasJoomeo, error) { 145 row := ct.DB.QueryRow(`SELECT personnes.* FROM personnes 146 JOIN equipiers ON equipiers.id_personne = personnes.id 147 WHERE equipiers.id = $1`, idEquipier) 148 personne, err := rd.ScanPersonne(row) 149 if err != nil { 150 return DatasJoomeo{}, err 151 } 152 153 api, err := joomeo.InitApi(ct.joomeo) 154 if err != nil { 155 return DatasJoomeo{}, shared.FormatErr("Le serveur Joomeo est indisponible.", err) 156 } 157 defer api.Kill() 158 159 contact, _, err := api.GetLoginFromMail(personne.Mail.ToLower()) 160 if err != nil { 161 return DatasJoomeo{}, shared.FormatErr("L'accès à tes informations Joomeo a échoué.", err) 162 } 163 164 return DatasJoomeo{ 165 SpaceURL: api.SpaceURL, 166 Login: contact.Login, 167 Password: contact.Password, 168 }, nil 169 }