Skip to content

Commit

Permalink
feat: get credential config endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
patlo-iog committed May 7, 2024
1 parent accff4f commit f6209b9
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,22 @@ object CredentialIssuerEndpoints {
.name("createCredentialConfiguration")
.summary("Create a new credential configuration")

val getCredentialConfigurationEndpoint: Endpoint[
(ApiKeyCredentials, JwtCredentials),
(RequestContext, UUID, String),
ErrorResponse,
CredentialConfiguration,
Any
] = baseIssuerPrivateEndpoint.get
.in(issuerIdPathSegment / "credential-configurations" / credentialConfigIdSegment)
.out(
statusCode(StatusCode.Ok).description("Get credential configuration successfully")
)
.out(jsonBody[CredentialConfiguration])
.errorOut(EndpointOutputs.basicFailureAndNotFoundAndForbidden)
.name("getCredentialConfiguration")
.summary("Get the credential configuration")

val deleteCredentialConfigurationEndpoint: Endpoint[
(ApiKeyCredentials, JwtCredentials),
(RequestContext, UUID, String),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,18 @@ case class CredentialIssuerServerEndpoints(
}
}

val getCredentialConfigurationServerEndpoint: ZServerEndpoint[Any, Any] =
CredentialIssuerEndpoints.getCredentialConfigurationEndpoint
.zServerSecurityLogic(SecurityLogic.authorizeWalletAccessWith(_)(authenticator, authorizer))
.serverLogic { wac =>
{ case (rc, issuerId, configurationId) =>
credentialIssuerController
.getCredentialConfiguration(rc, issuerId, configurationId)
.provideSomeLayer(ZLayer.succeed(wac))
.logTrace(rc)
}
}

val deleteCredentialConfigurationServerEndpoint: ZServerEndpoint[Any, Any] =
CredentialIssuerEndpoints.deleteCredentialConfigurationEndpoint
.zServerSecurityLogic(SecurityLogic.authorizeWalletAccessWith(_)(authenticator, authorizer))
Expand All @@ -143,6 +155,7 @@ case class CredentialIssuerServerEndpoints(
updateCredentialIssuerServerEndpoint,
deleteCredentialIssuerServerEndpoint,
createCredentialConfigurationServerEndpoint,
getCredentialConfigurationServerEndpoint,
deleteCredentialConfigurationServerEndpoint,
issuerMetadataServerEndpoint
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ trait CredentialIssuerController {
request: CreateCredentialConfigurationRequest
): ZIO[WalletAccessContext, ErrorResponse, CredentialConfiguration]

def getCredentialConfiguration(
ctx: RequestContext,
issuerId: UUID,
configurationId: String
): ZIO[WalletAccessContext, ErrorResponse, CredentialConfiguration]

def deleteCredentialConfiguration(
ctx: RequestContext,
issuerId: UUID,
Expand Down Expand Up @@ -296,6 +302,15 @@ case class CredentialIssuerControllerImpl(
} yield credentialConfiguration: CredentialConfiguration
}

override def getCredentialConfiguration(
ctx: RequestContext,
issuerId: UUID,
configurationId: String
): ZIO[WalletAccessContext, ErrorResponse, CredentialConfiguration] =
for {
credentialConfiguration <- issuerMetadataService.getCredentialConfigurationById(issuerId, configurationId)
} yield credentialConfiguration: CredentialConfiguration

override def deleteCredentialConfiguration(
ctx: RequestContext,
issuerId: UUID,
Expand All @@ -304,10 +319,10 @@ case class CredentialIssuerControllerImpl(
issuerMetadataService.deleteCredentialConfiguration(issuerId, configurationId)

override def getIssuerMetadata(ctx: RequestContext, issuerId: UUID): IO[ErrorResponse, IssuerMetadata] = {
for
for {
credentialIssuer <- issuerMetadataService.getCredentialIssuer(issuerId)
credentialConfigurations <- issuerMetadataService.getCredentialConfigurations(issuerId)
yield IssuerMetadata.fromIssuer(agentBaseUrl, credentialIssuer, credentialConfigurations)
} yield IssuerMetadata.fromIssuer(agentBaseUrl, credentialIssuer, credentialConfigurations)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ trait OIDC4VCIssuerMetadataRepository {
def deleteIssuer(issuerId: UUID): URIO[WalletAccessContext, Unit]
def createCredentialConfiguration(issuerId: UUID, config: CredentialConfiguration): URIO[WalletAccessContext, Unit]
def findCredentialConfigurationsByIssuer(issuerId: UUID): UIO[Seq[CredentialConfiguration]]
def findCredentialConfigurationById(
issuerId: UUID,
configurationId: String
): URIO[WalletAccessContext, Option[CredentialConfiguration]]
def deleteCredentialConfiguration(issuerId: UUID, configurationId: String): URIO[WalletAccessContext, Unit]
}

Expand Down Expand Up @@ -90,6 +94,12 @@ class InMemoryOIDC4VCIssuerMetadataRepository(
m.collect { case ((_, iss), configs) if iss == issuerId => configs }.flatten.toSeq
}

// TODO: Implement
override def findCredentialConfigurationById(
issuerId: UUID,
configurationId: String
): URIO[WalletAccessContext, Option[CredentialConfiguration]] = ???

override def deleteCredentialConfiguration(
issuerId: UUID,
configurationId: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,10 +71,14 @@ trait OIDC4VCIssuerMetadataService {
def getCredentialConfigurations(
issuerId: UUID
): IO[IssuerIdNotFound, Seq[CredentialConfiguration]]
def getCredentialConfigurationById(
issuerId: UUID,
configurationId: String
): ZIO[WalletAccessContext, CredentialConfigurationNotFound, CredentialConfiguration]
def deleteCredentialConfiguration(
issuerId: UUID,
configurationId: String,
): ZIO[WalletAccessContext, IssuerIdNotFound | CredentialConfigurationNotFound, Unit]
): ZIO[WalletAccessContext, CredentialConfigurationNotFound, Unit]
}

class OIDC4VCIssuerMetadataServiceImpl(repository: OIDC4VCIssuerMetadataRepository, uriDereferencer: URIDereferencer)
Expand Down Expand Up @@ -152,10 +156,18 @@ class OIDC4VCIssuerMetadataServiceImpl(repository: OIDC4VCIssuerMetadataReposito
.someOrFail(IssuerIdNotFound(issuerId))
.flatMap(_ => repository.findCredentialConfigurationsByIssuer(issuerId))

override def getCredentialConfigurationById(
issuerId: UUID,
configurationId: String
): ZIO[WalletAccessContext, CredentialConfigurationNotFound, CredentialConfiguration] =
repository
.findCredentialConfigurationById(issuerId, configurationId)
.someOrFail(CredentialConfigurationNotFound(issuerId, configurationId))

override def deleteCredentialConfiguration(
issuerId: UUID,
configurationId: String
): ZIO[WalletAccessContext, IssuerIdNotFound | CredentialConfigurationNotFound, Unit] =
): ZIO[WalletAccessContext, CredentialConfigurationNotFound, Unit] =
repository
.deleteCredentialConfiguration(issuerId, configurationId)
.catchSomeDefect { case _: UnexpectedAffectedRow =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,24 +112,6 @@ class JdbcOIDC4VCIssuerMetadataRepository(xa: Transactor[ContextAwareTask], xb:
.ensureOneAffectedRowOrDie
}

override def findCredentialConfigurationsByIssuer(issuerId: UUID): UIO[Seq[CredentialConfiguration]] = {
val cxnIO = sql"""
|SELECT
| configuration_id,
| format,
| schema_id,
| created_at
|FROM public.issuer_credential_configuration
|WHERE issuer_id = $issuerId
""".stripMargin
.query[CredentialConfiguration]
.to[Seq]

cxnIO
.transact(xb)
.orDie
}

override def createCredentialConfiguration(
issuerId: UUID,
config: CredentialConfiguration
Expand All @@ -155,6 +137,45 @@ class JdbcOIDC4VCIssuerMetadataRepository(xa: Transactor[ContextAwareTask], xb:
.ensureOneAffectedRowOrDie
}

override def findCredentialConfigurationsByIssuer(issuerId: UUID): UIO[Seq[CredentialConfiguration]] = {
val cxnIO = sql"""
|SELECT
| configuration_id,
| format,
| schema_id,
| created_at
|FROM public.issuer_credential_configuration
|WHERE issuer_id = $issuerId
""".stripMargin
.query[CredentialConfiguration]
.to[Seq]

cxnIO
.transact(xb)
.orDie
}

override def findCredentialConfigurationById(
issuerId: UUID,
configurationId: String
): URIO[WalletAccessContext, Option[CredentialConfiguration]] = {
val cxnIO = sql"""
|SELECT
| configuration_id,
| format,
| schema_id,
| created_at
|FROM public.issuer_credential_configuration
|WHERE issuer_id = $issuerId AND configuration_id = $configurationId
""".stripMargin
.query[CredentialConfiguration]
.option

cxnIO
.transactWallet(xa)
.orDie
}

override def deleteCredentialConfiguration(
issuerId: UUID,
configurationId: String
Expand Down

0 comments on commit f6209b9

Please sign in to comment.