Skip to content

Commit

Permalink
feat: update credential issuer implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
patlo-iog committed May 7, 2024
1 parent 8151a1a commit a985a34
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,10 @@ case class CredentialIssuerServerEndpoints(
.zServerSecurityLogic(SecurityLogic.authorizeWalletAccessWith(_)(authenticator, authorizer))
.serverLogic { wac =>
{ case (rc, issuerId, request) =>
// credentialIssuerController
// .updateCredentialIssuer(rc, issuerId, request)
// .provideSomeLayer(ZLayer.succeed(wac))
// .logTrace(rc)
ZIO.dieMessage("Not implemented") // TODO: implement
credentialIssuerController
.updateCredentialIssuer(rc, issuerId, request)
.provideSomeLayer(ZLayer.succeed(wac))
.logTrace(rc)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ trait CredentialIssuerController {
ctx: RequestContext
): ZIO[WalletAccessContext, ErrorResponse, CredentialIssuerPage]

def updateCredentialIssuer(
ctx: RequestContext,
issuerId: UUID,
request: PatchCredentialIssuerRequest
): ZIO[WalletAccessContext, ErrorResponse, CredentialIssuer]

def deleteCredentialIssuer(
ctx: RequestContext,
issuerId: UUID,
Expand Down Expand Up @@ -117,6 +123,11 @@ case class CredentialIssuerControllerImpl(
import CredentialIssuerController.Errors.*
import OIDCCredentialIssuerService.Errors.*

private def parseURL(url: String): IO[ErrorResponse, URL] =
ZIO
.attempt(URI.create(url).toURL())
.mapError(ue => badRequest(detail = Some(s"Invalid URL: $url")))

private def parseIssuerDID[E](didRef: String, errorFn: (String, String) => E): IO[E, CanonicalPrismDID] = {
for {
prismDID <- ZIO
Expand Down Expand Up @@ -223,14 +234,11 @@ case class CredentialIssuerControllerImpl(
override def createCredentialIssuer(
ctx: RequestContext,
request: CreateCredentialIssuerRequest
): ZIO[WalletAccessContext, ErrorResponse, CredentialIssuer] = {
): ZIO[WalletAccessContext, ErrorResponse, CredentialIssuer] =
for {
authServerUrl <- ZIO
.attempt(URI.create(request.authorizationServer).toURL())
.mapError(ue => badRequest(detail = Some(s"Invalid URL: ${request.authorizationServer}")))
authServerUrl <- parseURL(request.authorizationServer)
issuer <- issuerMetadataService.createCredentialIssuer(authServerUrl)
} yield issuer
}

override def getCredentialIssuers(
ctx: RequestContext
Expand All @@ -244,6 +252,21 @@ case class CredentialIssuerControllerImpl(
contents = issuers.map(i => i)
)

override def updateCredentialIssuer(
ctx: RequestContext,
issuerId: UUID,
request: PatchCredentialIssuerRequest
): ZIO[WalletAccessContext, ErrorResponse, CredentialIssuer] =
for {
maybeAuthServerUrl <- ZIO
.succeed(request.authorizationServer)
.flatMap {
case Some(url) => parseURL(url).asSome
case None => ZIO.none
}
issuer <- issuerMetadataService.updateCredentialIssuer(issuerId, maybeAuthServerUrl)
} yield issuer: CredentialIssuer

override def deleteCredentialIssuer(
ctx: RequestContext,
issuerId: UUID
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import org.hyperledger.identus.shared.models.WalletAccessContext
import org.hyperledger.identus.shared.models.WalletId
import zio.*

import java.net.URL
import java.time.Instant
import java.util.UUID
import java.{util => ju}

trait OIDC4VCIssuerMetadataRepository {
def findIssuer(issuerId: UUID): UIO[Option[CredentialIssuer]]
def createIssuer(issuer: CredentialIssuer): URIO[WalletAccessContext, Unit]
def findWalletIssuers: URIO[WalletAccessContext, Seq[CredentialIssuer]]
def findIssuer(issuerId: UUID): UIO[Option[CredentialIssuer]]
def updateIssuer(issuerId: UUID, authorizationServer: Option[URL] = None): URIO[WalletAccessContext, CredentialIssuer]
def deleteIssuer(issuerId: UUID): URIO[WalletAccessContext, Unit]
def createCredentialConfiguration(issuerId: UUID, config: CredentialConfiguration): URIO[WalletAccessContext, Unit]
def findAllCredentialConfigurations(issuerId: UUID): UIO[Seq[CredentialConfiguration]]
Expand All @@ -23,6 +25,9 @@ class InMemoryOIDC4VCIssuerMetadataRepository(
credentialConfigStore: Ref[Map[(WalletId, UUID), Seq[CredentialConfiguration]]]
) extends OIDC4VCIssuerMetadataRepository {

override def findIssuer(issuerId: UUID): UIO[Option[CredentialIssuer]] =
issuerStore.get.map(m => m.values.flatten.find(_.id == issuerId))

override def createIssuer(issuer: CredentialIssuer): URIO[WalletAccessContext, Unit] =
for {
walletId <- ZIO.serviceWith[WalletAccessContext](_.walletId)
Expand All @@ -35,10 +40,19 @@ class InMemoryOIDC4VCIssuerMetadataRepository(
store <- issuerStore.get
} yield store.getOrElse(walletId, Nil)

override def findIssuer(issuerId: UUID): UIO[Option[CredentialIssuer]] =
issuerStore.get.map(m => m.values.flatten.find(_.id == issuerId))
override def updateIssuer(
issuerId: UUID,
authorizationServer: Option[URL]
): URIO[WalletAccessContext, CredentialIssuer] =
for {
issuer <- findIssuer(issuerId)
.someOrElseZIO(ZIO.dieMessage("Update credential issuer fail. The issuer does not exist"))
updatedIssuer = issuer.copy(updatedAt = Instant.now)
_ <- deleteIssuer(issuerId)
_ <- createIssuer(updatedIssuer)
} yield updatedIssuer

override def deleteIssuer(issuerId: ju.UUID): URIO[WalletAccessContext, Unit] =
override def deleteIssuer(issuerId: UUID): URIO[WalletAccessContext, Unit] =
for {
walletId <- ZIO.serviceWith[WalletAccessContext](_.walletId)
_ <- issuerStore.update(m => m.updated(walletId, m.getOrElse(walletId, Nil).filter(_.id != issuerId)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,14 @@ object OIDC4VCIssuerMetadataServiceError {
}

trait OIDC4VCIssuerMetadataService {
def getCredentialIssuer(issuerId: UUID): IO[IssuerIdNotFound, CredentialIssuer]
def createCredentialIssuer(authorizationServer: URL): URIO[WalletAccessContext, CredentialIssuer]
def getCredentialIssuers: URIO[WalletAccessContext, Seq[CredentialIssuer]]
def getCredentialIssuer(issuerId: UUID): IO[IssuerIdNotFound, CredentialIssuer]
def deleteCredentialIssuer(issuerId: UUID): URIO[WalletAccessContext, Unit]
def updateCredentialIssuer(
issuerId: UUID,
authorizationServer: Option[URL] = None
): ZIO[WalletAccessContext, IssuerIdNotFound, CredentialIssuer]
def deleteCredentialIssuer(issuerId: UUID): ZIO[WalletAccessContext, IssuerIdNotFound, Unit]
def createCredentialConfiguration(
issuerId: UUID,
format: CredentialFormat,
Expand Down Expand Up @@ -75,8 +79,20 @@ class OIDC4VCIssuerMetadataServiceImpl(repository: OIDC4VCIssuerMetadataReposito
.findIssuer(issuerId)
.someOrFail(IssuerIdNotFound(issuerId))

override def deleteCredentialIssuer(issuerId: UUID): URIO[WalletAccessContext, Unit] =
repository.deleteIssuer(issuerId)
override def updateCredentialIssuer(
issuerId: UUID,
authorizationServer: Option[URL]
): ZIO[WalletAccessContext, IssuerIdNotFound, CredentialIssuer] =
for {
_ <- getCredentialIssuer(issuerId)
updatedIssuer <- repository.updateIssuer(issuerId, authorizationServer = authorizationServer)
} yield updatedIssuer

override def deleteCredentialIssuer(issuerId: UUID): ZIO[WalletAccessContext, IssuerIdNotFound, Unit] =
for {
_ <- getCredentialIssuer(issuerId)
_ <- repository.deleteIssuer(issuerId)
} yield ()

override def createCredentialConfiguration(
issuerId: UUID,
Expand Down

0 comments on commit a985a34

Please sign in to comment.