Skip to content

Commit

Permalink
add structures service
Browse files Browse the repository at this point in the history
  • Loading branch information
antoine2116 committed Nov 20, 2023
1 parent 26c4186 commit 35b065e
Show file tree
Hide file tree
Showing 8 changed files with 807 additions and 2 deletions.
11 changes: 9 additions & 2 deletions choruspro.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,9 @@ type Client struct {
common service

// Services
Transverses *TransversesService
Factures *FacturesService
Structures *StructuresService
Transverses *TransversesService
Utilisateurs *UtilisateursService
}

Expand Down Expand Up @@ -105,11 +106,13 @@ func (c *Client) initialize() {
c.common.client = c
c.BaseUrl, _ = url.Parse(defaultBaseURL)
c.AuthUrl, _ = url.Parse(defaultAuthURL)
c.Transverses = (*TransversesService)(&c.common)
c.Factures = (*FacturesService)(&c.common)
c.Structures = (*StructuresService)(&c.common)
c.Transverses = (*TransversesService)(&c.common)
c.Utilisateurs = (*UtilisateursService)(&c.common)
}

// newRequest creates an API request for the Chorus Pro API.
func (c *Client) newRequest(ctx context.Context, method, url string, body interface{}) (*http.Request, error) {
if !strings.HasSuffix(c.BaseUrl.Path, "/") {
return nil, fmt.Errorf("BaseURL must have a trailing slash, but %q does not", c.BaseUrl)
Expand All @@ -136,6 +139,9 @@ func (c *Client) newRequest(ctx context.Context, method, url string, body interf
return req, nil
}

// doRequest performs an HTTP request to the Chorus Pro API
// and routes it through the Piste API. It also handles
// authentication and token refresh.
func (c *Client) doRequest(ctx context.Context, req *http.Request, obj interface{}) error {
// Check if token is valid, if not, get a new one
if !c.token.Valid() {
Expand Down Expand Up @@ -175,6 +181,7 @@ func (c *Client) doRequest(ctx context.Context, req *http.Request, obj interface
return json.Unmarshal(data, obj)
}

// getOAuthToken retrieves an OAuth token from the Piste API
func getOAuthToken(clientId, clientSecret string, authUrl *url.URL) (*oauth2.Token, error) {
u, _ := authUrl.Parse("api/oauth/token")
c := http.DefaultClient
Expand Down
5 changes: 5 additions & 0 deletions structures.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package choruspro

// StructuresService gère les appels à l'API Structures
// API docs : https://developer.aife.economie.gouv.fr/api-catalog-sandbox?filter=Structures
type StructuresService service
154 changes: 154 additions & 0 deletions structures_consultations.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
package choruspro

import (
"context"
"net/http"
"time"
)

// AdressePostale est la structure de données représentant une adresse postale
// d'une structure ou d'un service.
type AdressePostale struct {
Adresse string `json:"adresse"`
CodePostal string `json:"codePostal"`
ComplementAdresse1 string `json:"complementAdresse1"`
ComplementAdresse2 string `json:"complementAdresse2"`
Fax string `json:"fax"`
IndicatifFax string `json:"indicatifFax"`
IndicatifTelephone string `json:"indicatifTelephone"`
Pays string `json:"pays"`
Telephone string `json:"telephone"`
Ville string `json:"ville"`
}

// StructureDupliquee est la structure de données représentant une l'identifiant
// d'une structure dupliquée.
type StructureDupliquee struct {
StructureDupliquee int64 `json:"structureDupliquee"`
}

// InformationGeneralesStructure est la structure de données représentant les
// informations générales d'une structure.
type InformationGeneralesStructure struct {
DateExpirationMotPasseCompteTech *time.Time `json:"dateExpirationMotPasseCompteTech"`
Email string `json:"emailStructure"`
EstValideurDeleguee bool `json:"estValideurDeleguee"`
IdCPP int64 `json:"idStructureCPP"`
IdOrigine int64 `json:"idStructureOrigine"`
Identifiant string `json:"identifiantStructure"`
Libelle string `json:"libelleStructure"`
ListeStructureDupliquees []StructureDupliquee `json:"listeStructureDupliquees"`
Nom string `json:"nomStructure"`
NumeroRcs string `json:"numeroRcsStructure"`
NumeroTVA string `json:"numeroTVA"`
Prenom string `json:"prenomStructure"`
RaisonSociale string `json:"raisonSocialeStructure"`
PriveePublique string `json:"structurePriveePublique"`
TypeIdentifiant string `json:"typeIdentifiantStructure"`
}

// ParametrageStructure est la structure de données représentant les
// paramètres d'une structure.
type ParametrageStructure struct {
CodeServiceDoitEtreRenseigne bool `json:"codeServiceDoitEtreRenseigne"`
ConnexionEDI bool `json:"connexionEDI"`
EstMoaUniquement bool `json:"estMoaUniquement"`
EstValideurDelegue bool `json:"estValideurDelegue"`
GestionNumeroEJOuCodeService bool `json:"gestionNumeroEJOuCodeService"`
GetaMoa bool `json:"getaMoa"`
NonDiffusibleInsee bool `json:"nonDiffusibleInsee"`
NumeroEJDoitEtreRenseigne bool `json:"numeroEJDoitEtreRenseigne"`
RecevoirDonneesViaEDI bool `json:"recevoirDonneesViaEDI"`
StatutMiseEnPaiementNestPasRemonte bool `json:"statutMiseEnPaiementNestPasRemonte"`
}

// ConsulterStructureResponse est la structure de données représentant la
// réponse de la méthode ConsulterStructure.
type ConsulterStructureResponse struct {
CodeRetour int32 `json:"codeRetour"`
Libelle string `json:"libelle"`
AdressePostale *AdressePostale `json:"adressePostaleDuSiege"`
InformationGenerales *InformationGeneralesStructure `json:"informationGenerales"`
Parametrage *ParametrageStructure `json:"parametres"`
}

// ConsulterStructureOptions est la structure de données utilisée pour
// appeler la méthode ConsulterStructure.
type ConsulterStructureOptions struct {
CodeLangue CodeLangue `json:"codeLangue"`
IdStructure int64 `json:"idStructure"`
}

// La méthode ConsulterStructure permet de consulter les informations relatives
// à une structure à laquelle l'utilisateur est rattaché ou une structure publique.
func (s *StructuresService) ConsulterStructure(ctx context.Context, opts ConsulterStructureOptions) (*ConsulterStructureResponse, error) {
req, err := s.client.newRequest(ctx, http.MethodPost, "cpro/structures/v1/consulter", opts)
if err != nil {
return nil, err
}

res := new(ConsulterStructureResponse)

err = s.client.doRequest(ctx, req, res)
if err != nil {
return nil, err
}

return res, nil
}

// InformationsGeneralesService est la structure de données représentant les
// informations générales d'un service.
type InformationsGeneralesService struct {
Code string `json:"codeService"`
Description string `json:"descriptionService"`
Nom string `json:"nomService"`
}

// ParametrageService est la structure de données représentant les paramètres
// d'un service.
type ParametrageService struct {
DateCreation *Datetime `json:"dateCreation"`
DateDebutValidite *Datetime `json:"dateDebutValidite"`
DateFinValidite *Datetime `json:"dateFinValidite"`
DateModification *Datetime `json:"dateModification"`
MiseEnPaiement bool `json:"miseEnPaiement"`
NumeroEngagement bool `json:"numeroEngagement"`
}

// ConsulterServiceResponse est la structure de données représentant la réponse
// de la méthode ConsulterService.
type ConsulterServiceResponse struct {
CodeRetour int32 `json:"codeRetour"`
Libelle string `json:"libelle"`
AdressePostale *AdressePostale `json:"adressePostale"`
InformationsGenerales *InformationsGeneralesService `json:"informationsGenerales"`
Parametrage *ParametrageService `json:"parametres"`
}

// ConsulterServiceOptions est la structure de données utilisée pour appeler
// la méthode ConsulterService.
type ConsulterServiceOptions struct {
CodeLangue CodeLangue `json:"codeLangue"`
IdService int64 `json:"idService"`
IdStructure int64 `json:"idStructure"`
}

// La méthode ConsulterService permet de consulter :
// - les informations relatives à un service auquel l'utilisateur est rattaché
// - les informations relatives à un service d'une structure publique.
func (s *StructuresService) ConsulterService(ctx context.Context, opts ConsulterServiceOptions) (*ConsulterServiceResponse, error) {
req, err := s.client.newRequest(ctx, http.MethodPost, "cpro/structures/v1/consulter/service", opts)
if err != nil {
return nil, err
}

res := new(ConsulterServiceResponse)

err = s.client.doRequest(ctx, req, res)
if err != nil {
return nil, err
}

return res, nil
}
Loading

0 comments on commit 35b065e

Please sign in to comment.