github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/espaceperso/messages.go (about) 1 package espaceperso 2 3 import ( 4 "fmt" 5 "time" 6 7 dm "github.com/benoitkugler/goACVE/server/core/datamodel" 8 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 9 "github.com/benoitkugler/goACVE/server/shared" 10 ) 11 12 const deltaVu = 30 * time.Minute // retarde le passage non vu -> vu 13 14 func isOld(message dm.PseudoMessage, lastCo time.Time) bool { 15 k := message.Kind 16 17 // exception pour les messages écrits par les parents .. ou supprimés .. 18 isResp := k == rd.MResponsable 19 isSuppr := k == rd.MSupprime 20 // ... pour les place libérées "répondues" 21 isPlrep := k == rd.MPlaceLiberee && !message.Modified.Time().IsZero() 22 23 // .. et pour les attestations /factures téléchargées 24 isDownload := false 25 if k == rd.MFactureAcquittee || k == rd.MAttestationPresence { 26 if d, ok := message.Contenu.(dm.ContenuAttestation); ok { 27 isDownload = d.Distribution == rd.DEspacePerso || d.Distribution == rd.DMailAndDownload 28 } 29 } else if k == rd.MFacture { 30 isDownload = !message.Modified.Time().IsZero() 31 } 32 33 // .. sinon, basé sur la dernière connection 34 nouveau := lastCo.Before(message.LastEvent().Add(deltaVu)) 35 36 return isResp || isDownload || isSuppr || isPlrep || !nouveau 37 } 38 39 func (ct Controller) creeMessage(idFacture int64, contenu rd.String) (dm.PseudoMessage, error) { 40 tx, err := ct.DB.Begin() 41 if err != nil { 42 return dm.PseudoMessage{}, err 43 } 44 // on crée le message ... 45 message := rd.Message{IdFacture: idFacture, Created: rd.Time(time.Now()), Kind: rd.MResponsable} 46 message, err = message.Insert(tx) 47 if err != nil { 48 return dm.PseudoMessage{}, shared.Rollback(tx, err) 49 } 50 // ... et le contenu 51 mMessage := rd.MessageMessage{IdMessage: message.Id, Contenu: contenu, GuardKind: message.Kind} 52 err = rd.InsertManyMessageMessages(tx, mMessage) 53 if err != nil { 54 return dm.PseudoMessage{}, shared.Rollback(tx, err) 55 } 56 err = tx.Commit() 57 out := dm.NewPseudoMessage(message, dm.POVResponsable, dm.ContenuPerso(mMessage.Contenu)) 58 // un message envoyé depuis l'espace perso est forcément vu 59 out.Vu = true 60 return out, err 61 } 62 63 func (ct Controller) editMessage(idFacture int64, modif EditMessage) (dm.PseudoMessage, error) { 64 tx, err := ct.DB.Begin() 65 if err != nil { 66 return dm.PseudoMessage{}, err 67 } 68 row := tx.QueryRow("UPDATE messages SET modified = $1 WHERE id = $2 RETURNING *", time.Now(), modif.Id) 69 message, err := rd.ScanMessage(row) 70 if err != nil { 71 return dm.PseudoMessage{}, shared.Rollback(tx, err) 72 } 73 74 // on vérifie les contraintes de sécurité 75 if message.IdFacture != idFacture { 76 _ = shared.Rollback(tx, nil) 77 return dm.PseudoMessage{}, fmt.Errorf("Ce message ne vous appartient pas.") 78 } 79 if message.Kind != rd.MResponsable { 80 _ = shared.Rollback(tx, nil) 81 return dm.PseudoMessage{}, fmt.Errorf("Seul est un message libre est modifiable.") 82 } 83 84 // on modifie le contenu 85 row = tx.QueryRow("UPDATE message_messages SET contenu = $1 WHERE id_message = $2 RETURNING *", modif.Contenu, message.Id) 86 mMessage, err := rd.ScanMessageMessage(row) 87 if err != nil { 88 return dm.PseudoMessage{}, shared.Rollback(tx, err) 89 } 90 err = tx.Commit() 91 out := dm.NewPseudoMessage(message, dm.POVResponsable, dm.ContenuPerso(mMessage.Contenu)) 92 // un message envoyé depuis l'espace perso est forcément vu 93 out.Vu = true 94 return out, err 95 } 96 97 // marque le message comme supprimé 98 func (ct Controller) deleteMessage(idFacture, idMessage int64) (dm.PseudoMessage, error) { 99 tx, err := ct.DB.Begin() 100 if err != nil { 101 return dm.PseudoMessage{}, err 102 } 103 104 // on vérifie la sécurité 105 message, err := rd.SelectMessage(tx, idMessage) 106 if err != nil { 107 return dm.PseudoMessage{}, shared.Rollback(tx, err) 108 } 109 if message.IdFacture != idFacture { 110 _ = shared.Rollback(tx, nil) 111 return dm.PseudoMessage{}, fmt.Errorf("Ce message ne vous appartient pas.") 112 } 113 if message.Kind != rd.MResponsable { 114 _ = shared.Rollback(tx, nil) 115 return dm.PseudoMessage{}, fmt.Errorf("Seul est un message libre est supprimable.") 116 } 117 118 // on supprime les liens ... 119 _, err = rd.DeleteMessageMessagesByIdMessages(tx, message.Id) 120 if err != nil { 121 return dm.PseudoMessage{}, shared.Rollback(tx, err) 122 } 123 // ... puis on modifie le type 124 message.Kind = rd.MSupprime 125 message.Modified = rd.Time(time.Now()) 126 message, err = message.Update(tx) 127 if err != nil { 128 return dm.PseudoMessage{}, shared.Rollback(tx, err) 129 } 130 err = tx.Commit() 131 out := dm.NewPseudoMessage(message, dm.POVResponsable, nil) 132 // un message envoyé depuis l'espace perso est forcément vu 133 out.Vu = true 134 return out, err 135 } 136 137 // vérifie qu'un message place libérée existe, puis passe le participant en liste 138 // principale 139 func (ct Controller) confirmePlaceliberee(idFacture int64, idMessage int64) error { 140 message, err := rd.SelectMessage(ct.DB, idMessage) 141 if err != nil { 142 return err 143 } 144 if message.Kind != rd.MPlaceLiberee { 145 return fmt.Errorf("Le message transmis est invalide.") 146 } 147 mP, found, err := rd.SelectMessagePlacelibereByIdMessage(ct.DB, message.Id) 148 if err != nil { 149 return err 150 } 151 if !found { 152 return fmt.Errorf("Le contenu du message Place libérée est introuvable.") 153 } 154 part, err := rd.SelectParticipant(ct.DB, mP.IdParticipant) 155 if err != nil { 156 return err 157 } 158 tx, err := ct.DB.Begin() 159 if err != nil { 160 return err 161 } 162 // on modifie le participant ... 163 part.ListeAttente.Statut = rd.Inscrit 164 _, err = part.Update(tx) 165 if err != nil { 166 return shared.Rollback(tx, err) 167 } 168 // ... et le message 169 _, err = tx.Exec("UPDATE messages SET modified = $1 WHERE id = $2", time.Now(), message.Id) 170 if err != nil { 171 return shared.Rollback(tx, err) 172 } 173 err = tx.Commit() 174 return err 175 }