package composition import ( "context" "encoding/json" "fmt" "net/url" "service/internal/interfaces/satusehat" ) type Repository interface { Create(ctx context.Context, payload interface{}) (*satusehat.FHIRResponse, error) Update(ctx context.Context, id string, payload interface{}) (*satusehat.FHIRResponse, error) Patch(ctx context.Context, id string, req CompositionPatchRequest) (*satusehat.FHIRResponse, error) GetByID(ctx context.Context, id string) (*satusehat.FHIRResponse, error) Search(ctx context.Context, queryParams url.Values) (*satusehat.FHIRResponse, error) } type repository struct { client satusehat.SatuSehatClient } func NewRepository(client satusehat.SatuSehatClient) Repository { return &repository{client: client} } func (r *repository) executeRequest(ctx context.Context, method, endpoint string, req interface{}) (*satusehat.FHIRResponse, error) { resp, err := r.client.DoRequest(ctx, method, endpoint, req) if err != nil { return nil, err } var result map[string]interface{} if err := json.Unmarshal(resp, &result); err != nil { return nil, fmt.Errorf("failed to unmarshal response: %w", err) } var resourceID string if id, ok := result["id"].(string); ok { resourceID = id } return &satusehat.FHIRResponse{ ID: resourceID, FullResponse: result, RawResponse: resp, }, nil } func (r *repository) Create(ctx context.Context, payload interface{}) (*satusehat.FHIRResponse, error) { return r.executeRequest(ctx, "POST", "/Composition", payload) } func (r *repository) Update(ctx context.Context, id string, payload interface{}) (*satusehat.FHIRResponse, error) { endpoint := fmt.Sprintf("/Composition/%s", id) return r.executeRequest(ctx, "PUT", endpoint, payload) } func (r *repository) Patch(ctx context.Context, id string, req CompositionPatchRequest) (*satusehat.FHIRResponse, error) { endpoint := fmt.Sprintf("/Composition/%s", id) return r.executeRequest(ctx, "PATCH", endpoint, req) } func (r *repository) GetByID(ctx context.Context, id string) (*satusehat.FHIRResponse, error) { endpoint := fmt.Sprintf("/Composition/%s", id) return r.executeRequest(ctx, "GET", endpoint, nil) } func (r *repository) Search(ctx context.Context, queryParams url.Values) (*satusehat.FHIRResponse, error) { endpoint := fmt.Sprintf("/Composition?%s", queryParams.Encode()) return r.executeRequest(ctx, "GET", endpoint, nil) }