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  }