@@ -56,23 +56,19 @@ type consentPurposeItem struct {
5656 Version string `json:"version"`
5757 DisplayName * string `json:"displayName,omitempty"`
5858 Description * string `json:"description,omitempty"`
59- Properties map [string ]string `json:"properties,omitempty"`
6059 Elements []consentElementItem `json:"elements"`
6160}
6261
6362type consentElementItem struct {
64- ElementID string `json:"elementId"`
65- Name string `json:"name"`
66- Namespace string `json:"namespace"`
67- Version string `json:"version"`
68- DisplayName * string `json:"displayName,omitempty"`
69- Approved bool `json:"approved"`
70- Mandatory bool `json:"mandatory"`
71- Value any `json:"value,omitempty"`
72- Type string `json:"type,omitempty"`
73- Description * string `json:"description,omitempty"`
74- Schema * string `json:"schema,omitempty"`
75- Properties map [string ]string `json:"properties,omitempty"`
63+ ElementID string `json:"elementId"`
64+ Name string `json:"name"`
65+ Namespace string `json:"namespace"`
66+ Version string `json:"version"`
67+ DisplayName * string `json:"displayName,omitempty"`
68+ Description * string `json:"description,omitempty"`
69+ Approved bool `json:"approved"`
70+ Mandatory bool `json:"mandatory"`
71+ Value any `json:"value,omitempty"`
7672}
7773
7874type consentAuthorizationEntry struct {
@@ -123,37 +119,6 @@ type consentUpdatePayload struct {
123119 Authorizations []consentAuthorizationPayload `json:"authorizations"`
124120}
125121
126- type purposeVersionResponse struct {
127- PurposeID string `json:"purposeId"`
128- Name string `json:"name"`
129- GroupID string `json:"groupId"`
130- Version string `json:"version"`
131- DisplayName * string `json:"displayName,omitempty"`
132- Description * string `json:"description,omitempty"`
133- Properties map [string ]string `json:"properties,omitempty"`
134- Elements []purposeVersionElement `json:"elements"`
135- }
136-
137- type purposeVersionElement struct {
138- ElementID string `json:"elementId"`
139- Name string `json:"name"`
140- Namespace string `json:"namespace"`
141- Version string `json:"version"`
142- Mandatory bool `json:"mandatory"`
143- }
144-
145- type elementVersionResponse struct {
146- ElementID string `json:"elementId"`
147- Name string `json:"name"`
148- Namespace string `json:"namespace"`
149- Version string `json:"version"`
150- Type string `json:"type"`
151- DisplayName * string `json:"displayName,omitempty"`
152- Description * string `json:"description,omitempty"`
153- Schema * string `json:"schema,omitempty"`
154- Properties map [string ]string `json:"properties,omitempty"`
155- }
156-
157122// NewService builds a me service from app config.
158123func NewService (cfg config.ProxyConfig ) (* Service , error ) {
159124 svc , err := proxy .NewService (cfg )
@@ -187,115 +152,6 @@ func toConsentApprovalKey(purposeID, purposeVersion, elementID, elementVersion s
187152 return strings .Join ([]string {purposeID , purposeVersion , elementID , elementVersion }, "\x00 " )
188153}
189154
190- // BuildAggregatedConsentResponse enriches a consent with metadata from its exact bound versions.
191- func (s * Service ) BuildAggregatedConsentResponse (r * http.Request , baseBody []byte ) ([]byte , error ) {
192- var consent consentRetrievalResponse
193- if err := json .Unmarshal (baseBody , & consent ); err != nil {
194- return nil , proxy .ErrUpstreamUnavailable
195- }
196- if err := s .enrichConsentMetadata (r , & consent ); err != nil {
197- return nil , err
198- }
199-
200- aggregated , err := json .Marshal (consent )
201- if err != nil {
202- return nil , proxy .ErrUpstreamUnavailable
203- }
204- return aggregated , nil
205- }
206-
207- func (s * Service ) enrichConsentMetadata (r * http.Request , consent * consentRetrievalResponse ) error {
208- elementMetadata := make (map [string ]elementVersionResponse )
209- for purposeIndex := range consent .Purposes {
210- purpose := & consent .Purposes [purposeIndex ]
211- if purpose .PurposeID == "" || purpose .Version == "" {
212- return proxy .ErrUpstreamUnavailable
213- }
214-
215- metadata , err := s .fetchPurposeVersion (r , purpose .PurposeID , purpose .Version )
216- if err != nil {
217- return err
218- }
219- if metadata .PurposeID != purpose .PurposeID || metadata .Version != purpose .Version {
220- return proxy .ErrUpstreamUnavailable
221- }
222- purpose .Name = metadata .Name
223- purpose .DisplayName = metadata .DisplayName
224- purpose .Description = metadata .Description
225- purpose .Properties = metadata .Properties
226-
227- mappedElements := make (map [string ]purposeVersionElement , len (metadata .Elements ))
228- for _ , element := range metadata .Elements {
229- mappedElements [toConsentApprovalKey (purpose .PurposeID , purpose .Version , element .ElementID , element .Version )] = element
230- }
231-
232- for elementIndex := range purpose .Elements {
233- element := & purpose .Elements [elementIndex ]
234- key := toConsentApprovalKey (purpose .PurposeID , purpose .Version , element .ElementID , element .Version )
235- mapped , ok := mappedElements [key ]
236- if ! ok {
237- return proxy .ErrUpstreamUnavailable
238- }
239- element .Name = mapped .Name
240- element .Namespace = mapped .Namespace
241- element .Mandatory = mapped .Mandatory
242-
243- elementKey := element .ElementID + "\x00 " + element .Version
244- details , ok := elementMetadata [elementKey ]
245- if ! ok {
246- details , err = s .fetchElementVersion (r , element .ElementID , element .Version )
247- if err != nil {
248- return err
249- }
250- if details .ElementID != element .ElementID || details .Version != element .Version {
251- return proxy .ErrUpstreamUnavailable
252- }
253- elementMetadata [elementKey ] = details
254- }
255- element .Name = details .Name
256- element .Namespace = details .Namespace
257- element .DisplayName = details .DisplayName
258- element .Type = details .Type
259- element .Description = details .Description
260- element .Schema = details .Schema
261- element .Properties = details .Properties
262- }
263- }
264- return nil
265- }
266-
267- func (s * Service ) fetchPurposeVersion (r * http.Request , purposeID , version string ) (purposeVersionResponse , error ) {
268- path := "/api/v1/consent-purposes/" + url .PathEscape (purposeID ) + "/versions/" + url .PathEscape (version )
269- resp , err := s .proxy .ForwardRaw (r , http .MethodGet , path , nil , nil )
270- if err != nil {
271- return purposeVersionResponse {}, err
272- }
273- if resp .StatusCode != http .StatusOK {
274- return purposeVersionResponse {}, proxy .ErrUpstreamUnavailable
275- }
276- var payload purposeVersionResponse
277- if err := json .Unmarshal (resp .Body , & payload ); err != nil {
278- return purposeVersionResponse {}, proxy .ErrUpstreamUnavailable
279- }
280- return payload , nil
281- }
282-
283- func (s * Service ) fetchElementVersion (r * http.Request , elementID , version string ) (elementVersionResponse , error ) {
284- path := "/api/v1/consent-elements/" + url .PathEscape (elementID ) + "/versions/" + url .PathEscape (version )
285- resp , err := s .proxy .ForwardRaw (r , http .MethodGet , path , nil , nil )
286- if err != nil {
287- return elementVersionResponse {}, err
288- }
289- if resp .StatusCode != http .StatusOK {
290- return elementVersionResponse {}, proxy .ErrUpstreamUnavailable
291- }
292- var payload elementVersionResponse
293- if err := json .Unmarshal (resp .Body , & payload ); err != nil {
294- return elementVersionResponse {}, proxy .ErrUpstreamUnavailable
295- }
296- return payload , nil
297- }
298-
299155func buildRevokePayload (in []byte , userID string ) ([]byte , error ) {
300156 userID = strings .TrimSpace (userID )
301157 if userID == "" {
@@ -335,14 +191,11 @@ func parseApprovalSelections(in []byte) ([]consentApprovalSelection, error) {
335191}
336192
337193// BuildApprovalUpdatePayload builds the consent update payload for an approval action.
338- func (s * Service ) BuildApprovalUpdatePayload (r * http. Request , baseBody []byte , selections []consentApprovalSelection , userID string ) ([]byte , string , error ) {
194+ func (s * Service ) BuildApprovalUpdatePayload (baseBody []byte , selections []consentApprovalSelection , userID string ) ([]byte , string , error ) {
339195 var consent consentRetrievalResponse
340196 if err := json .Unmarshal (baseBody , & consent ); err != nil {
341197 return nil , "" , proxy .ErrUpstreamUnavailable
342198 }
343- if err := s .enrichConsentMetadata (r , & consent ); err != nil {
344- return nil , "" , err
345- }
346199
347200 selectedOptionalElements := make (map [string ]struct {}, len (selections ))
348201 for _ , selection := range selections {
0 commit comments