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

     1  package datamodel
     2  
     3  import (
     4  	"compress/gzip"
     5  	"encoding/json"
     6  	"io"
     7  	"log"
     8  	"os"
     9  
    10  	"github.com/benoitkugler/goACVE/logs"
    11  	rd "github.com/benoitkugler/goACVE/server/core/rawdata"
    12  )
    13  
    14  // ----------------------------- JSON -----------------------------
    15  
    16  // MarshalBaseLocale dumps la base en JSON, avec indentation
    17  func MarshalBaseLocale(b *BaseLocale, out io.Writer) error {
    18  	enc := json.NewEncoder(out)
    19  	enc.SetIndent(" ", "  ")
    20  	enc.SetEscapeHTML(false)
    21  	err := enc.Encode(b)
    22  	return err
    23  }
    24  
    25  // MarshalCompress marshal et compresse, sans indentation
    26  func (b *BaseLocale) MarshalCompress(out io.Writer) error {
    27  	return marshalCompress(b, out)
    28  }
    29  
    30  func marshalCompress(v interface{}, out io.Writer) error {
    31  	gzOut := gzip.NewWriter(out)
    32  
    33  	enc := json.NewEncoder(gzOut)
    34  	enc.SetEscapeHTML(false)
    35  
    36  	err := enc.Encode(v)
    37  	if err != nil {
    38  		return err
    39  	}
    40  	err = gzOut.Close()
    41  	return err
    42  }
    43  
    44  func UnMarshalBaseLocale(in io.Reader) (BaseLocale, error) {
    45  	dec := json.NewDecoder(in)
    46  	var b BaseLocale
    47  	err := dec.Decode(&b)
    48  	return b, err
    49  }
    50  
    51  func DecompressUnMarshalBaseLocale(in io.Reader) (BaseLocale, error) {
    52  	gzIn, err := gzip.NewReader(in)
    53  	if err != nil {
    54  		return BaseLocale{}, err
    55  	}
    56  	defer gzIn.Close()
    57  
    58  	dec := json.NewDecoder(gzIn)
    59  	var b BaseLocale
    60  	err = dec.Decode(&b)
    61  	return b, err
    62  }
    63  
    64  // -------------------------------- SQL -------------------------------
    65  
    66  // a garder synchronisé
    67  func loadLinksById(db rd.DB, items map[string][]int64) (out RawLinks, err error) {
    68  	out.EquipierContraintes, err = rd.SelectEquipierContraintesByIdEquipiers(db, items["EquipierContraintes"]...)
    69  	if err != nil {
    70  		return out, err
    71  	}
    72  	out.GroupeParticipants, err = rd.SelectGroupeParticipantsByIdParticipants(db, items["ParticipantGroupe"]...)
    73  	if err != nil {
    74  		return out, err
    75  	}
    76  	out.ParticipantEquipiers, err = rd.SelectParticipantEquipiersByIdParticipants(db, items["ParticipantEquipier"]...)
    77  	if err != nil {
    78  		return out, err
    79  	}
    80  	out.GroupeContraintes, err = rd.SelectGroupeContraintesByIdGroupes(db, items["GroupeContraintes"]...)
    81  	if err != nil {
    82  		return out, err
    83  	}
    84  	out.CampContraintes, err = rd.SelectCampContraintesByIdCamps(db, items["CampContraintes"]...)
    85  	if err != nil {
    86  		return out, err
    87  	}
    88  	out.DocumentPersonnes, err = rd.SelectDocumentPersonnesByIdDocuments(db, items["DocumentPersonnes"]...)
    89  	if err != nil {
    90  		return out, err
    91  	}
    92  	out.DocumentAides, err = rd.SelectDocumentAidesByIdDocuments(db, items["DocumentAides"]...)
    93  	if err != nil {
    94  		return out, err
    95  	}
    96  	out.DocumentCamps, err = rd.SelectDocumentCampsByIdDocuments(db, items["DocumentCamps"]...)
    97  	if err != nil {
    98  		return out, err
    99  	}
   100  	out.MessageDocuments, err = rd.SelectMessageDocumentsByIdMessages(db, items["MessageDocuments"]...)
   101  	if err != nil {
   102  		return out, err
   103  	}
   104  	out.MessageSondages, err = rd.SelectMessageSondagesByIdMessages(db, items["MessageSondages"]...)
   105  	if err != nil {
   106  		return out, err
   107  	}
   108  	out.MessagePlaceliberes, err = rd.SelectMessagePlaceliberesByIdMessages(db, items["MessagePlaceliberes"]...)
   109  	if err != nil {
   110  		return out, err
   111  	}
   112  	out.MessageAttestations, err = rd.SelectMessageAttestationsByIdMessages(db, items["MessageAttestations"]...)
   113  	if err != nil {
   114  		return out, err
   115  	}
   116  	out.MessageMessages, err = rd.SelectMessageMessagesByIdMessages(db, items["MessageMessages"]...)
   117  	if err != nil {
   118  		return out, err
   119  	}
   120  	out.DonDonateurs, err = rd.SelectDonDonateursByIdDons(db, items["DonDonateurs"]...)
   121  	if err != nil {
   122  		return out, err
   123  	}
   124  	return out, nil
   125  }
   126  
   127  func (b *BaseLocale) ProcessRawLinks(rl RawLinks) {
   128  	out := rd.Links{
   129  		EquipierContraintes: rl.EquipierContraintes.ByIdEquipier(),
   130  		ParticipantGroupe:   rl.GroupeParticipants.ByIdParticipant(),
   131  		ParticipantEquipier: rl.ParticipantEquipiers.ByIdParticipant(),
   132  		GroupeContraintes:   rl.GroupeContraintes.ByIdGroupe(),
   133  		CampContraintes:     rl.CampContraintes.ByIdCamp(),
   134  		DocumentPersonnes:   rl.DocumentPersonnes.ByIdDocument(),
   135  		DocumentAides:       rl.DocumentAides.ByIdDocument(),
   136  		DocumentCamps:       rl.DocumentCamps.ByIdDocument(),
   137  		MessageDocuments:    rl.MessageDocuments.ByIdMessage(),
   138  		MessageSondages:     rl.MessageSondages.ByIdMessage(),
   139  		MessagePlaceliberes: rl.MessagePlaceliberes.ByIdMessage(),
   140  		MessageAttestations: rl.MessageAttestations.ByIdMessage(),
   141  		MessageMessages:     rl.MessageMessages.ByIdMessage(),
   142  		DonDonateurs:        rl.DonDonateurs.ByIdDon(),
   143  	}
   144  	b.Links = out
   145  }
   146  
   147  // GetBase renvoie la base de developpement distante.
   148  // Utile pour des tests
   149  func GetBase(dev bool) *BaseLocale {
   150  	logsDB := logs.DBProd
   151  	if dev {
   152  		logsDB = logs.DBDev
   153  	}
   154  	db, err := rd.ConnectDB(logsDB)
   155  	if err != nil {
   156  		log.Fatal(err)
   157  	}
   158  	defer db.Close()
   159  	base, err := LoadRemoteBaseLocale(db)
   160  	if err != nil {
   161  		log.Fatal(err)
   162  	}
   163  	return base
   164  }
   165  
   166  // GetLocalDBDev renvoie la base locale.
   167  // A utiliser depuis le dossier principal
   168  func GetLocalDBDev() *BaseLocale {
   169  	f, err := os.Open("local/DB.json")
   170  	if err != nil {
   171  		log.Fatal(err)
   172  	}
   173  	base, err := UnMarshalBaseLocale(f)
   174  	if err != nil {
   175  		log.Fatal(err)
   176  	}
   177  	return &base
   178  }