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  }