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(&params); 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  }