Skip to content
This repository has been archived by the owner on Aug 16, 2024. It is now read-only.

Commit

Permalink
feat: add personaData support
Browse files Browse the repository at this point in the history
  • Loading branch information
xstelea committed Mar 20, 2023
1 parent a840f6d commit f4cc5c4
Show file tree
Hide file tree
Showing 8 changed files with 55 additions and 27 deletions.
17 changes: 11 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,8 @@ type WalletSdkInput = {
| [oneTimeAccountsWithProofOfOwnership](#onetimeaccountswithproofofownership) | ❌ |
| [ongoingAccountsWithoutProofOfOwnership](#ongoingaccountswithoutproofofownership) | ✅ |
| [ongoingAccountsWithProofOfOwnership](#ongoingaccountswithproofofownership) | ❌ |
| [oneTimePersonaData](#onetimepersonadata) | |
| [ongoingPersonaData](#ongoingpersonadata) | |
| [oneTimePersonaData](#onetimepersonadata) | |
| [ongoingPersonaData](#ongoingpersonadata) | |
| [loginWithChallenge](#loginwithchallenge) | ❌ |
| [loginWithoutChallenge](#loginwithoutchallenge) | ✅ |
| [usePersona](#usepersona) | ✅ |
Expand Down Expand Up @@ -254,9 +254,14 @@ const value = result.value

### Get list of Persona data

This request type is for a list of personal data fields such as `firstName`, `email`, `shippingAddress`, etc. associated with the user's selected Persona.
This request type is for a list of personal data fields associated with the user's selected Persona.

**NOTE:** A complete list of supported data fields will be provided later when this request type becomes supported.
| Available persona data fields |
| :---------------------------- |
| `"givenName"` |
| `"familyName"` |
| `"emailAddress"` |
| `"phoneNumber"` |

**Types**

Expand All @@ -271,7 +276,7 @@ type PersonaDataField = {
```typescript
const result = await walletSdk.request(
requestBuilder(requestItem.oneTimePersonaData(['firstName', 'email']))
requestBuilder(requestItem.oneTimePersonaData(['givenName', 'emailAddress']))
)

if (result.isErr()) {
Expand All @@ -290,7 +295,7 @@ const value = result.value
const result = await walletSdk.request(
requestBuilder(
requestItem.usePersona(identityAddress),
requestItem.ongoingPersonaData(['firstName', 'email'])
requestItem.ongoingPersonaData(['givenName', 'emailAddress'])
)
)

Expand Down
2 changes: 1 addition & 1 deletion examples/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ document.getElementById('persona-accounts-btn')!.onclick = async () => {

const result = await sdk.request(
requestBuilder(
requestItem.oneTimePersonaData('firstName', 'email'),
requestItem.oneTimePersonaData('givenName'),
requestItem.oneTimeAccounts.withoutProofOfOwnership(5)
)
)
Expand Down
5 changes: 3 additions & 2 deletions lib/IO/request-items/one-time-persona-data.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
OneTimePersonaDataRequestItem,
OneTimePersonaDataRequestResponseItem,
PersonaDataField,
} from '../schemas'

export type OneTimePersonaData = {
Expand All @@ -12,14 +13,14 @@ export type OneTimePersonaData = {
output: {
oneTimePersonaData: OneTimePersonaDataRequestResponseItem['fields']
}
input: { fields: string[] }
input: { fields: PersonaDataField[] }
}
}

type NotAllowedKeys = { oneTimePersonaData: any }

export const oneTimePersonaData =
(...fields: string[]) =>
(...fields: PersonaDataField[]) =>
<I>(input: I extends NotAllowedKeys ? never : I) => ({
...input,
oneTimePersonaData: { fields },
Expand Down
12 changes: 8 additions & 4 deletions lib/IO/request-items/ongoing-persona-data.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
OngoingPersonaDataRequestItem,
OngoingPersonaDataRequestResponseItem,
PersonaData,
PersonaDataField,
} from '../schemas'

Expand All @@ -10,17 +11,20 @@ export type OngoingPersonaData = {
response: OngoingPersonaDataRequestResponseItem
}
method: {
output: { ongoingPersonaData: PersonaDataField[] }
input: { fields: string[] }
output: { ongoingPersonaData: PersonaData[] }
input: { fields: PersonaDataField[] }
}
}

type RequiredKeys = { usePersona: any } | { login: any }
type RequiredKeys =
| { usePersona: any }
| { loginWithoutChallenge: any }
| { loginWithChallenge: any }

type NotAllowedKeys = { ongoingPersonaData: any }

export const ongoingPersonaData =
(...fields: string[]) =>
(...fields: PersonaDataField[]) =>
<I extends RequiredKeys>(input: I extends NotAllowedKeys ? never : I) => ({
...input,
ongoingPersonaData: { fields },
Expand Down
28 changes: 22 additions & 6 deletions lib/IO/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,22 @@ export const ErrorTypeSchema = union([
literal('unknownDappDefinitionAddress'),
])

export const personaDataField = {
givenName: 'givenName',
familyName: 'familyName',
emailAddress: 'emailAddress',
phoneNumber: 'phoneNumber',
} as const

export const PersonaDataFieldSchema = union([
literal(personaDataField.emailAddress),
literal(personaDataField.familyName),
literal(personaDataField.givenName),
literal(personaDataField.phoneNumber),
])

export type PersonaDataField = z.infer<typeof PersonaDataFieldSchema>

const AccountSchema = object({
address: string(),
label: string(),
Expand All @@ -52,12 +68,12 @@ const PersonaSchema = object({

export type Persona = z.infer<typeof PersonaSchema>

const PersonaDataFieldSchema = object({
field: string(),
const PersonaDataSchema = object({
field: PersonaDataFieldSchema,
value: string(),
})

export type PersonaDataField = z.infer<typeof PersonaDataFieldSchema>
export type PersonaData = z.infer<typeof PersonaDataSchema>

const NumberOfAccountsQuantifierSchema = union([
literal('exactly'),
Expand Down Expand Up @@ -159,23 +175,23 @@ export type OneTimePersonaDataRequestItem = z.infer<
>

const OneTimePersonaDataRequestResponseItemSchema = object({
fields: PersonaDataFieldSchema.array(),
fields: PersonaDataSchema.array(),
})

export type OneTimePersonaDataRequestResponseItem = z.infer<
typeof OneTimePersonaDataRequestResponseItemSchema
>

const OngoingPersonaDataRequestItemSchema = object({
fields: string().array(),
fields: PersonaDataFieldSchema.array(),
})

export type OngoingPersonaDataRequestItem = z.infer<
typeof OngoingPersonaDataRequestItemSchema
>

const OngoingPersonaDataRequestResponseItemSchema = object({
fields: PersonaDataFieldSchema.array(),
fields: PersonaDataSchema.array(),
})

export type OngoingPersonaDataRequestResponseItem = z.infer<
Expand Down
4 changes: 2 additions & 2 deletions lib/__tests__/schemas.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ describe('schemas', () => {
oneTimePersonaData: {
fields: [
{
field: 'test',
field: 'emailAddress',
value: 'test',
},
],
Expand All @@ -150,7 +150,7 @@ describe('schemas', () => {
ongoingPersonaData: {
fields: [
{
field: 'test',
field: 'emailAddress',
value: 'test',
},
],
Expand Down
8 changes: 4 additions & 4 deletions lib/__tests__/transform-method-input.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,11 +214,11 @@ describe('transformMethodInput', () => {
it('should return correct transformed value', () => {
;[
{
actual: requestItem.oneTimePersonaData('email'),
actual: requestItem.oneTimePersonaData('emailAddress'),
expected: {
discriminator: 'unauthorizedRequest',
[RequestTypeSchema.oneTimePersonaData.value]: {
fields: ['email'],
fields: ['emailAddress'],
},
},
},
Expand All @@ -233,11 +233,11 @@ describe('transformMethodInput', () => {
it('should return correct transformed value', () => {
;[
{
actual: requestItem.ongoingPersonaData('email'),
actual: requestItem.ongoingPersonaData('emailAddress'),
expected: {
discriminator: 'unauthorizedRequest',
[RequestTypeSchema.ongoingPersonaData.value]: {
fields: ['email'],
fields: ['emailAddress'],
},
},
},
Expand Down
6 changes: 4 additions & 2 deletions lib/methods/request.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import { Login } from '../IO/request-items/login'
import { OneTimeAccounts } from '../IO/request-items/one-time-accounts'
import { OneTimePersonaData } from '../IO/request-items/one-time-persona-data'
import { OngoingAccounts } from '../IO/request-items/ongoing-accounts'
import { OngoingPersonaData } from '../IO/request-items/ongoing-persona-data'
import { Reset } from '../IO/request-items/reset'
import { UsePersona } from '../IO/request-items/use-persona'

Expand Down Expand Up @@ -28,8 +30,8 @@ type RequestItems = {
[requestMethodRequestType.usePersona]: UsePersona
[requestMethodRequestType.loginWithoutChallenge]: Login['WithoutChallenge']
// [requestMethodRequestType.loginWithChallenge]: Login['WithChallenge']
// [requestMethodRequestType.oneTimePersonaData]: OneTimePersonaData
// [requestMethodRequestType.ongoingPersonaData]: OngoingPersonaData
[requestMethodRequestType.oneTimePersonaData]: OneTimePersonaData
[requestMethodRequestType.ongoingPersonaData]: OngoingPersonaData
}

type RequestMethodRequestTypes = keyof RequestItems
Expand Down

0 comments on commit f4cc5c4

Please sign in to comment.