From dda51430f70ed490598578507b5de1e7f514082d Mon Sep 17 00:00:00 2001 From: martinsaporiti Date: Mon, 16 Sep 2024 18:16:23 -0300 Subject: [PATCH] chore: add deeplink to getlinks endpoint --- internal/api/links.go | 4 ++-- internal/api/links_test.go | 8 ++++---- internal/api/responses.go | 6 +++--- internal/core/ports/link_repository.go | 2 +- internal/core/ports/link_service.go | 2 +- internal/core/services/link.go | 25 ++++++++++++++++++------- internal/repositories/link.go | 9 ++++++--- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/internal/api/links.go b/internal/api/links.go index 372d7f6fc..5e0ae4a7a 100644 --- a/internal/api/links.go +++ b/internal/api/links.go @@ -30,7 +30,7 @@ func (s *Server) GetLinks(ctx context.Context, request GetLinksRequestObject) (G return GetLinks400JSONResponse{N400JSONResponse{Message: "unknown request type. Allowed: all|active|inactive|exceed"}}, nil } } - links, err := s.linkService.GetAll(ctx, *issuerDID, status, request.Params.Query) + links, err := s.linkService.GetAll(ctx, *issuerDID, status, request.Params.Query, s.cfg.ServerUrl) if err != nil { log.Error(ctx, "getting links", "err", err, "req", request) } @@ -162,7 +162,7 @@ func (s *Server) GetLink(ctx context.Context, request GetLinkRequestObject) (Get log.Error(ctx, "obtaining a link", "err", err.Error(), "id", request.Id) return GetLink500JSONResponse{N500JSONResponse{Message: "error getting link"}}, nil } - return GetLink200JSONResponse(getLinkResponse(*link)), nil + return GetLink200JSONResponse(getLinkResponse(link)), nil } // ActivateLink - Activates or deactivates a link diff --git a/internal/api/links_test.go b/internal/api/links_test.go index d7c84eef1..1ac7ffb67 100644 --- a/internal/api/links_test.go +++ b/internal/api/links_test.go @@ -545,7 +545,7 @@ func TestServer_GetAllLinks(t *testing.T) { }, ) require.NoError(t, err) - linkActive := getLinkResponse(*link1) + linkActive := getLinkResponse(link1) time.Sleep(10 * time.Millisecond) @@ -560,7 +560,7 @@ func TestServer_GetAllLinks(t *testing.T) { }, ) require.NoError(t, err) - linkExpired := getLinkResponse(*link2) + linkExpired := getLinkResponse(link2) require.NoError(t, err) time.Sleep(10 * time.Millisecond) @@ -568,7 +568,7 @@ func TestServer_GetAllLinks(t *testing.T) { link3.Active = false require.NoError(t, err) require.NoError(t, server.Services.links.Activate(ctx, *did, link3.ID, false)) - linkInactive := getLinkResponse(*link3) + linkInactive := getLinkResponse(link3) require.NoError(t, err) time.Sleep(10 * time.Millisecond) @@ -939,7 +939,7 @@ func TestServer_CreateLinkQRCode(t *testing.T) { handler := getHandler(ctx, server) - linkDetail := getLinkResponse(*link) + linkDetail := getLinkResponse(link) type expected struct { linkDetail Link diff --git a/internal/api/responses.go b/internal/api/responses.go index 9fcf63d21..c4ec3fad8 100644 --- a/internal/api/responses.go +++ b/internal/api/responses.go @@ -37,7 +37,7 @@ func (response CustomQrContentResponse) visit(w http.ResponseWriter) error { return err } -func getLinkResponses(links []domain.Link) []Link { +func getLinkResponses(links []*domain.Link) []Link { res := make([]Link, len(links)) for i, link := range links { res[i] = getLinkResponse(link) @@ -45,7 +45,7 @@ func getLinkResponses(links []domain.Link) []Link { return res } -func getLinkResponse(link domain.Link) Link { +func getLinkResponse(link *domain.Link) Link { hash, _ := link.Schema.Hash.MarshalText() var credentialExpiration *timeapi.Time if link.CredentialExpiration != nil { @@ -84,7 +84,7 @@ func getLinkResponse(link domain.Link) Link { SchemaUrl: link.Schema.URL, SchemaHash: string(hash), Status: LinkStatus(link.Status()), - ProofTypes: getLinkProofs(link), + ProofTypes: getLinkProofs(*link), CreatedAt: TimeUTC(link.CreatedAt), Expiration: validUntil, CredentialExpiration: credentialExpiration, diff --git a/internal/core/ports/link_repository.go b/internal/core/ports/link_repository.go index bd1670594..cb0ab9cfc 100644 --- a/internal/core/ports/link_repository.go +++ b/internal/core/ports/link_repository.go @@ -15,7 +15,7 @@ import ( type LinkRepository interface { Save(ctx context.Context, conn db.Querier, link *domain.Link) (*uuid.UUID, error) GetByID(ctx context.Context, issuerID w3c.DID, id uuid.UUID) (*domain.Link, error) - GetAll(ctx context.Context, issuerDID w3c.DID, status LinkStatus, query *string) ([]domain.Link, error) + GetAll(ctx context.Context, issuerDID w3c.DID, status LinkStatus, query *string) ([]*domain.Link, error) Delete(ctx context.Context, id uuid.UUID, issuerDID w3c.DID) error AddAuthorizationRequest(ctx context.Context, linkID uuid.UUID, issuerDID w3c.DID, authorizationRequest *protocol.AuthorizationRequestMessage) error } diff --git a/internal/core/ports/link_service.go b/internal/core/ports/link_service.go index 821540059..f6f0814e4 100644 --- a/internal/core/ports/link_service.go +++ b/internal/core/ports/link_service.go @@ -58,7 +58,7 @@ type LinkService interface { Activate(ctx context.Context, issuerID w3c.DID, linkID uuid.UUID, active bool) error Delete(ctx context.Context, id uuid.UUID, did w3c.DID) error GetByID(ctx context.Context, issuerID w3c.DID, id uuid.UUID, serverURL string) (*domain.Link, error) - GetAll(ctx context.Context, issuerDID w3c.DID, status LinkStatus, query *string) ([]domain.Link, error) + GetAll(ctx context.Context, issuerDID w3c.DID, status LinkStatus, query *string, serverURL string) ([]*domain.Link, error) CreateQRCode(ctx context.Context, issuerDID w3c.DID, linkID uuid.UUID, serverURL string) (*CreateQRCodeResponse, error) IssueOrFetchClaim(ctx context.Context, issuerDID w3c.DID, userDID w3c.DID, linkID uuid.UUID, hostURL string) (*protocol.CredentialsOfferMessage, error) ProcessCallBack(ctx context.Context, issuerDID w3c.DID, message string, linkID uuid.UUID, hostURL string) (*protocol.CredentialsOfferMessage, error) diff --git a/internal/core/services/link.go b/internal/core/services/link.go index 865fe9a5f..37f9a557b 100644 --- a/internal/core/services/link.go +++ b/internal/core/services/link.go @@ -149,17 +149,28 @@ func (ls *Link) GetByID(ctx context.Context, issuerID w3c.DID, id uuid.UUID, ser return nil, err } - if link.AuthorizationRequestMessage != nil { - link.DeepLink = common.ToPointer(ls.qrService.ToDeepLink(serverURL, id, &issuerID)) - link.UniversalLink = common.ToPointer(ls.qrService.ToUniversalLink(ls.cfg.BaseUrl, ls.cfg.BaseUrl, link.ID, &issuerID)) - } - + ls.addLinksToLink(link, serverURL, issuerID) return link, nil } // GetAll returns all links from issueDID of type lType filtered by query string -func (ls *Link) GetAll(ctx context.Context, issuerDID w3c.DID, status ports.LinkStatus, query *string) ([]domain.Link, error) { - return ls.linkRepository.GetAll(ctx, issuerDID, status, query) +func (ls *Link) GetAll(ctx context.Context, issuerDID w3c.DID, status ports.LinkStatus, query *string, serverURL string) ([]*domain.Link, error) { + links, err := ls.linkRepository.GetAll(ctx, issuerDID, status, query) + if err != nil { + return links, err + } + + for _, link := range links { + ls.addLinksToLink(link, serverURL, issuerDID) + } + return links, nil +} + +func (ls *Link) addLinksToLink(link *domain.Link, serverURL string, issuerDID w3c.DID) { + if link.AuthorizationRequestMessage != nil { + link.DeepLink = common.ToPointer(ls.qrService.ToDeepLink(serverURL, link.ID, &issuerDID)) + link.UniversalLink = common.ToPointer(ls.qrService.ToUniversalLink(ls.cfg.BaseUrl, ls.cfg.BaseUrl, link.ID, &issuerDID)) + } } // Delete - delete a link by id diff --git a/internal/repositories/link.go b/internal/repositories/link.go index 0e3741ce5..4c71fe93c 100644 --- a/internal/repositories/link.go +++ b/internal/repositories/link.go @@ -137,7 +137,7 @@ GROUP BY links.id, schemas.id return &link, err } -func (l link) GetAll(ctx context.Context, issuerDID w3c.DID, status ports.LinkStatus, query *string) ([]domain.Link, error) { +func (l link) GetAll(ctx context.Context, issuerDID w3c.DID, status ports.LinkStatus, query *string) ([]*domain.Link, error) { sql := ` SELECT links.id, links.issuer_id, @@ -152,6 +152,7 @@ SELECT links.id, links.active, links.refresh_service, links.display_method, + links.authorization_request_message, count(claims.id) as issued_claims, schemas.id as schema_id, schemas.issuer_id as schema_issuer_id, @@ -198,10 +199,11 @@ WHERE links.issuer_id = $1 defer rows.Close() schema := dbSchema{} - link := domain.Link{} - links := make([]domain.Link, 0) + var link *domain.Link + links := make([]*domain.Link, 0) var credentialAttributes pgtype.JSONB for rows.Next() { + link = &domain.Link{} if err := rows.Scan( &link.ID, &link.IssuerDID, @@ -215,6 +217,7 @@ WHERE links.issuer_id = $1 &link.Active, &link.RefreshService, &link.DisplayMethod, + &link.AuthorizationRequestMessage, &link.IssuedClaims, &schema.ID, &schema.IssuerID,