Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
ALTER TABLE "step" ADD COLUMN "screenId" text;
ALTER TABLE "step" ADD COLUMN "screenId" text;--> statement-breakpoint
ALTER TABLE "credentialDefinition" ALTER COLUMN "icon" DROP NOT NULL;
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class CredentialDefinitionRepository implements RepositoryDefinition<CredentialD
) {}

async create(credentialDefinition: NewCredentialDefinition): Promise<CredentialDefinition> {
const iconResult = await this.assetRepository.findById(credentialDefinition.icon)
const iconResult = credentialDefinition.icon && (await this.assetRepository.findById(credentialDefinition.icon))
const credentialSchemaResult = await this.credentialSchemaRepository.findById(credentialDefinition.credentialSchema)

return (await this.databaseService.getConnection()).transaction(async (tx): Promise<CredentialDefinition> => {
Expand Down Expand Up @@ -44,7 +44,7 @@ class CredentialDefinitionRepository implements RepositoryDefinition<CredentialD
return {
...credentialDefinitionResult,
credentialSchema: credentialSchemaResult,
icon: iconResult,
icon: iconResult ? iconResult : undefined,
representations: [], //credentialRepresentationsResult, TODO SHOWCASE-81 enable
revocation: revocationResult,
}
Expand All @@ -59,7 +59,7 @@ class CredentialDefinitionRepository implements RepositoryDefinition<CredentialD
async update(id: string, credentialDefinition: NewCredentialDefinition): Promise<CredentialDefinition> {
await this.findById(id)

const iconResult = await this.assetRepository.findById(credentialDefinition.icon)
const iconResult = credentialDefinition.icon && (await this.assetRepository.findById(credentialDefinition.icon))
const credentialSchemaResult = await this.credentialSchemaRepository.findById(credentialDefinition.credentialSchema)
return (await this.databaseService.getConnection()).transaction(async (tx): Promise<CredentialDefinition> => {
const [credentialDefinitionResult] = await tx
Expand Down Expand Up @@ -93,7 +93,7 @@ class CredentialDefinitionRepository implements RepositoryDefinition<CredentialD
return {
...credentialDefinitionResult,
credentialSchema: credentialSchemaResult,
icon: iconResult,
icon: iconResult || undefined,
representations: [], //credentialRepresentationsResult, TODO SHOWCASE-81 enable
revocation: revocationResult,
}
Expand Down Expand Up @@ -123,6 +123,7 @@ class CredentialDefinitionRepository implements RepositoryDefinition<CredentialD

return {
...result,
icon: result.icon ? result.icon : undefined,
credentialSchema: result.cs,
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ describe('Database credential definition repository tests', (): void => {
expect(savedCredentialDefinition.name).toEqual(credentialDefinition.name)
expect(savedCredentialDefinition.version).toEqual(credentialDefinition.version)
expect(savedCredentialDefinition.icon).toBeDefined()
expect(savedCredentialDefinition.icon.id).toBeDefined()
expect(savedCredentialDefinition.icon.mediaType).toEqual(asset.mediaType)
expect(savedCredentialDefinition.icon.fileName).toEqual(asset.fileName)
expect(savedCredentialDefinition.icon.description).toEqual(asset.description)
expect(savedCredentialDefinition.icon.content).toStrictEqual(asset.content)
expect(savedCredentialDefinition.icon!.id).toBeDefined()
expect(savedCredentialDefinition.icon!.mediaType).toEqual(asset.mediaType)
expect(savedCredentialDefinition.icon!.fileName).toEqual(asset.fileName)
expect(savedCredentialDefinition.icon!.description).toEqual(asset.description)
expect(savedCredentialDefinition.icon!.content).toStrictEqual(asset.content)

// TODO SHOWCASE-81 representations
//expect(savedCredentialDefinition.representations.length).toEqual(2)
Expand All @@ -116,6 +116,37 @@ describe('Database credential definition repository tests', (): void => {
// expect(savedCredentialDefinition.revocation!.description).toEqual(credentialDefinition.revocation!.description)
})

it('Should save the credential definition without icon to database', async (): Promise<void> => {
const credentialDefinition: NewCredentialDefinition = {
name: 'example_name',
version: 'example_version',
identifierType: IdentifierType.DID,
identifier: 'did:sov:XUeUZauFLeBNofY3NhaZCB',
type: CredentialType.ANONCRED,
credentialSchema: credentialSchema.id,
// representations: [
// { // TODO SHOWCASE-81 OCARepresentation
//
// },
// { // TODO SHOWCASE-81 OCARepresentation
//
// }
// ],
//revocation: {
// TODO SHOWCASE-80 AnonCredRevocation
//title: 'example_revocation_title',
// description: 'example_revocation_description',
// },
}

const savedCredentialDefinition = await credentialDefinitionRepository.create(credentialDefinition)

expect(savedCredentialDefinition).toBeDefined()
expect(savedCredentialDefinition.name).toEqual(credentialDefinition.name)
expect(savedCredentialDefinition.version).toEqual(credentialDefinition.version)
expect(savedCredentialDefinition.icon).toBeUndefined()
})

it('Should throw error when saving credential definition with invalid icon id', async (): Promise<void> => {
const unknownIconId = 'a197e5b2-e4e5-4788-83b1-ecaa0e99ed3a'
const credentialDefinition: NewCredentialDefinition = {
Expand Down Expand Up @@ -169,11 +200,11 @@ describe('Database credential definition repository tests', (): void => {
expect(fromDb.name).toEqual(credentialDefinition.name)
expect(fromDb.version).toEqual(credentialDefinition.version)
expect(fromDb.icon).toBeDefined()
expect(fromDb.icon.id).toBeDefined()
expect(fromDb.icon.mediaType).toEqual(asset.mediaType)
expect(fromDb.icon.fileName).toEqual(asset.fileName)
expect(fromDb.icon.description).toEqual(asset.description)
expect(fromDb.icon.content).toStrictEqual(asset.content)
expect(fromDb.icon!.id).toBeDefined()
expect(fromDb.icon!.mediaType).toEqual(asset.mediaType)
expect(fromDb.icon!.fileName).toEqual(asset.fileName)
expect(fromDb.icon!.description).toEqual(asset.description)
expect(fromDb.icon!.content).toStrictEqual(asset.content)
// TODO SHOWCASE-81 representations
//expect(fromDb.representations.length).toEqual(2)
// expect(fromDb.revocation).not.toBeNull()
Expand Down Expand Up @@ -278,11 +309,58 @@ describe('Database credential definition repository tests', (): void => {
expect(updatedCredentialDefinition.name).toEqual(newName)
expect(updatedCredentialDefinition.version).toEqual(credentialDefinition.version)
expect(updatedCredentialDefinition.icon).toBeDefined()
expect(updatedCredentialDefinition.icon.id).toBeDefined()
expect(updatedCredentialDefinition.icon.mediaType).toEqual(asset.mediaType)
expect(updatedCredentialDefinition.icon.fileName).toEqual(asset.fileName)
expect(updatedCredentialDefinition.icon.description).toEqual(asset.description)
expect(updatedCredentialDefinition.icon.content).toStrictEqual(asset.content)
expect(updatedCredentialDefinition.icon!.id).toBeDefined()
expect(updatedCredentialDefinition.icon!.mediaType).toEqual(asset.mediaType)
expect(updatedCredentialDefinition.icon!.fileName).toEqual(asset.fileName)
expect(updatedCredentialDefinition.icon!.description).toEqual(asset.description)
expect(updatedCredentialDefinition.icon!.content).toStrictEqual(asset.content)
// TODO SHOWCASE-81 representations
//expect(updatedCredentialDefinition.representations.length).toEqual(2)
// TODO SHOWCASE-80 AnonCredRevocation
// expect(updatedCredentialDefinition.revocation).not.toBeNull()
// expect(updatedCredentialDefinition.revocation!.title).toEqual(credentialDefinition.revocation!.title)
// expect(updatedCredentialDefinition.revocation!.description).toEqual(credentialDefinition.revocation!.description)
})

it('Should update credential definition in database passing in an undefined icon', async (): Promise<void> => {
const credentialDefinition: NewCredentialDefinition = {
name: 'example_name',
version: 'example_version',
identifierType: IdentifierType.DID,
identifier: 'did:sov:XUeUZauFLeBNofY3NhaZCB',
icon: asset.id,
type: CredentialType.ANONCRED,
credentialSchema: credentialSchema.id,
// representations: [
// { // TODO SHOWCASE-81 OCARepresentation
//
// },
// { // TODO SHOWCASE-81 OCARepresentation
//
// }
// ],
//revocation: {
// TODO SHOWCASE-80 AnonCredRevocation
//title: 'example_revocation_title',
// description: 'example_revocation_description',
// },
}

const savedCredentialDefinition = await credentialDefinitionRepository.create(credentialDefinition)
expect(savedCredentialDefinition).toBeDefined()

const newName = 'new_name'
const updatedCredentialDefinition = await credentialDefinitionRepository.update(savedCredentialDefinition.id, {
...credentialDefinition,
icon: undefined,
credentialSchema: credentialSchema.id,
name: newName,
})

expect(updatedCredentialDefinition).toBeDefined()
expect(updatedCredentialDefinition.name).toEqual(newName)
expect(updatedCredentialDefinition.version).toEqual(credentialDefinition.version)
expect(updatedCredentialDefinition.icon).toBeUndefined()
// TODO SHOWCASE-81 representations
//expect(updatedCredentialDefinition.representations.length).toEqual(2)
// TODO SHOWCASE-80 AnonCredRevocation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ export const credentialDefinitions = pgTable(
credentialSchema: uuid('credential_schema')
.references(() => credentialSchemas.id)
.notNull(),
icon: uuid()
.references(() => assets.id)
.notNull(),
icon: uuid().references(() => assets.id),
type: CredentialTypePg().notNull().$type<CredentialType>(),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ export type NewPersona = Omit<typeof personas.$inferInsert, 'slug'> & {

export type CredentialDefinition = Omit<typeof credentialDefinitions.$inferSelect, 'icon' | 'type' | 'credentialSchema'> & {
type: CredentialType
icon: Asset
icon?: Asset
credentialSchema: CredentialSchema
representations: CredentialRepresentation[]
revocation?: RevocationInfo | null
Expand Down
2 changes: 1 addition & 1 deletion apps/credential-showcase-api-server/src/utils/mappers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export const credentialDefinitionDTOFrom = (credentialDefinition: CredentialDefi
credentialSchema: credentialSchemaDTOFrom(credentialDefinition.credentialSchema),
representations: credentialDefinition.representations,
revocation: credentialDefinition.revocation || undefined,
icon: assetDTOFrom(credentialDefinition.icon),
icon: credentialDefinition.icon ? assetDTOFrom(credentialDefinition?.icon) : undefined,
}
}

Expand Down
2 changes: 0 additions & 2 deletions packages/credential-showcase-openapi/openapi/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2571,7 +2571,6 @@ components:
- version
- type
- credentialSchema
- icon
# TODO enable back in SHOWCASE-81
# - representations
- createdAt
Expand Down Expand Up @@ -2627,7 +2626,6 @@ components:
- name
- version
- type
- icon
- credentialSchema
# TODO enable back in SHOWCASE-81
# - representations
Expand Down