github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/sondages/sondages.go (about)

     1  package sondages
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"sort"
     7  	"strconv"
     8  	"strings"
     9  
    10  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    11  	"github.com/benoitkugler/goACVE/server/core/rawdata/composites"
    12  	"github.com/benoitkugler/goACVE/server/core/utils/mails"
    13  	"github.com/benoitkugler/goACVE/logs"
    14  	"github.com/benoitkugler/goACVE/server/shared"
    15  	"github.com/labstack/echo"
    16  )
    17  
    18  const (
    19  	EndpointSondages = "/sondages/:key"
    20  
    21  	mailGestionSondage = "commentaires@acve.asso.fr"
    22  
    23  	bodyMail = `Bonjour, <br/>
    24  	Un avis sur le séjour %s vient d'être enregistré (ou modifié). 
    25  	%s <br/><br/>
    26  	Plus de détails sont <a href="%s">disponibles ici</a>. <br/>
    27  	A bientôt !
    28  	`  // labelSejour, messages, urlSondages
    29  )
    30  
    31  type Controller struct {
    32  	shared.Controller
    33  }
    34  
    35  func PageSondages(c echo.Context) error {
    36  	return c.File("server/static/bv/sondages.html")
    37  }
    38  
    39  func (ct Controller) LoadSondages(c echo.Context) error {
    40  	key := c.Param("key")
    41  	if key != logs.KeyAdminSondages {
    42  		return errors.New("La clé d'accès est incorrecte.")
    43  	}
    44  
    45  	rows, err := ct.DB.Query("SELECT camps.* FROM camps JOIN sondages ON sondages.id_camp = camps.id")
    46  	if err != nil {
    47  		return err
    48  	}
    49  	camps, err := rd.ScanCamps(rows)
    50  	if err != nil {
    51  		return err
    52  	}
    53  	rows, err = ct.DB.Query(`SELECT  sondages.*, factures.*, personnes.* FROM sondages
    54  	JOIN factures ON sondages.id_facture = factures.id
    55  	JOIN personnes ON factures.id_personne = personnes.id`)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	sondages, err := composites.ScanSondageFacturePersonnes(rows)
    60  	if err != nil {
    61  		return err
    62  	}
    63  	out := make([]SondageDetails, len(sondages))
    64  	for i, sondage := range sondages {
    65  		out[i].Sondage = sondage.Sondage
    66  		out[i].Responsable = sondage.Personne.NomPrenom().String()
    67  		out[i].Mail = sondage.Personne.Mail.String()
    68  		out[i].Camp = camps[sondage.IdCamp].Label().String()
    69  	}
    70  	sort.Slice(out, func(i, j int) bool {
    71  		return out[i].Modified.After(out[j].Modified)
    72  	})
    73  	return c.JSON(200, out)
    74  }
    75  
    76  // Notifie envoie un mail sur ajout ou création d'une réponse
    77  // à un sondage.
    78  func (ct Controller) Notifie(host string, sondage rd.Sondage) error {
    79  	camp, err := rd.SelectCamp(ct.DB, sondage.IdCamp)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	var messages string
    85  	if me := sondage.MessageEnfant.TrimSpace().String(); me != "" {
    86  		me = strings.Join(strings.Split(me, "\n"), "<br/>")
    87  		messages += "<br/><br/><b>Retour d'un participant :</b> <br/>" + me
    88  	}
    89  	if me := sondage.MessageResponsable.TrimSpace().String(); me != "" {
    90  		me = strings.Join(strings.Split(me, "\n"), "<br/>")
    91  		messages += "<br/><br/><b>Retour du responsable : </b><br/>" + me
    92  	}
    93  	lien := shared.BuildUrl(host, strings.Replace(EndpointSondages, ":key", logs.KeyAdminSondages, -1), map[string]string{"id": strconv.Itoa(int(sondage.Id))})
    94  	body := fmt.Sprintf(bodyMail, camp.Label(), messages, lien)
    95  
    96  	err = mails.NewMailer(ct.SMTP).SendMail(mailGestionSondage, "[ACVE] Nouvel avis", body, nil, nil)
    97  	return err
    98  }