Skip to content
Open
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
26 changes: 25 additions & 1 deletion api-schema.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,29 @@ type Mutation {
syncUserProfile: JSON
userDeleteIdentity(identityId: String!): Boolean
userLinkIdentity(input: IdentityUserLinkInput!): Identity
userOnboardingCreateProfile(publicKey: String!): [Int!]
userOnboardingCustomizeProfile(avatarUrl: String!, username: String!): Boolean
userUpdateUser(input: UserUserUpdateInput!): User
userVerifyIdentityChallenge(input: IdentityVerifyChallengeInput!): IdentityChallenge
}

type OnboardingRequirements {
profileAccount: String
socialIdentities: Int
solanaIdentities: Int
step: OnboardingStep!
validAvatarUrl: Boolean
validUsername: Boolean
}

enum OnboardingStep {
CreateProfile
CustomizeProfile
Finished
LinkSocialIdentities
LinkSolanaWallets
}

type PagingMeta {
currentPage: Int!
isFirstPage: Boolean!
Expand All @@ -138,7 +157,6 @@ type PubkeyProfile {
authorities: [String!]!
avatarUrl: String!
bump: Int!
feePayer: String!
identities: [PubkeyProfileIdentity!]!
publicKey: String!
username: String!
Expand Down Expand Up @@ -168,6 +186,9 @@ type Query {
userFindManyIdentity(input: IdentityUserFindManyInput!): [Identity!]
userFindManyUser(input: UserUserFindManyInput!): UserPaging!
userFindOneUser(username: String!): User
userGetOnboardingAvatarUrls: [String!]
userGetOnboardingUsernames: [String!]
userOnboardingRequirements: OnboardingRequirements
userRequestIdentityChallenge(input: IdentityRequestChallengeInput!): IdentityChallenge
}

Expand All @@ -183,6 +204,7 @@ type User {
id: String!
identities: [Identity!]
name: String
onboarded: Boolean
profile: String
profileUrl: String!
role: UserRole
Expand All @@ -208,6 +230,8 @@ input UserAdminUpdateInput {
avatarUrl: String
developer: Boolean
name: String
onboarded: Boolean
profile: String
role: UserRole
status: UserStatus
username: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ function createGoogleProfile(profile: Profile) {
return {
externalId: profile.id,
username: (profile.emails as Array<{ value?: string }>)[0].value,
avatarUrl: profile.photos?.[0].value,
// avatarUrl: profile.photos?.[0].value,
name: profile.displayName,
}
}
17 changes: 16 additions & 1 deletion libs/api/core/data-access/src/lib/api-core.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Injectable } from '@nestjs/common'
import { EventEmitter2 } from '@nestjs/event-emitter'
import { IdentityProvider } from '@prisma/client'
import { IdentityProvider, Prisma } from '@prisma/client'
import { ApiCorePrismaClient, prismaClient } from './api-core-prisma-client'
import { ApiCoreConfigService } from './config/api-core-config.service'
import { slugifyId } from './helpers/slugify-id'
Expand All @@ -11,6 +11,17 @@ export class ApiCoreService {
readonly data: ApiCorePrismaClient = prismaClient
constructor(readonly config: ApiCoreConfigService, readonly eventEmitter: EventEmitter2) {}

async ensureUserById(userId: string) {
const user = await this.data.user.findUnique({
where: { id: userId },
include: { identities: true },
})
if (!user) {
throw new Error(`User ${userId} not found`)
}
return user
}

async findUserByIdentity({ provider, providerId }: { provider: IdentityProvider; providerId: string }) {
return this.data.identity.findUnique({
where: { provider_providerId: { provider, providerId } },
Expand Down Expand Up @@ -45,4 +56,8 @@ export class ApiCoreService {
include: { identities: true },
})
}

async updateUserById(userId: string, data: Prisma.UserUpdateInput) {
return this.data.user.update({ where: { id: userId }, data })
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,10 @@ export class ApiCoreConfigService {
return '/api'
}

get pubkeyProtocolCommunity(): string {
return this.service.get<string>('pubkeyProtocolCommunity') as string
}

get pubkeyProtocolSigner(): Keypair {
return this.service.get<Keypair>('pubkeyProtocolSigner') as Keypair
}
Expand Down
2 changes: 2 additions & 0 deletions libs/api/core/data-access/src/lib/config/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export interface ApiCoreConfig {
jwtSecret: string
port: number
sessionSecret: string
pubkeyProtocolCommunity: string
pubkeyProtocolSigner: Keypair
pubkeyProtocolSignerMinimalBalance: number
solanaEndpoint: string
Expand Down Expand Up @@ -106,6 +107,7 @@ export function configuration(): ApiCoreConfig {
host: process.env['HOST'] as string,
jwtSecret: process.env['JWT_SECRET'] as string,
port: parseInt(process.env['PORT'] as string, 10) || 3000,
pubkeyProtocolCommunity: process.env['PUBKEY_PROTOCOL_COMMUNITY'] as string,
pubkeyProtocolSigner: getKeypairFromByteArray(
JSON.parse(process.env['PUBKEY_PROTOCOL_SIGNER_SECRET_KEY'] as string),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export const validationSchema = Joi.object({
HOST: Joi.string().default('0.0.0.0'),
NODE_ENV: Joi.string().valid('development', 'production', 'test', 'provision').default('development'),
PORT: Joi.number().default(3000),
PUBKEY_PROTOCOL_COMMUNITY: Joi.string().required(),
PUBKEY_PROTOCOL_SIGNER_SECRET_KEY: Joi.string().required(),
PUBKEY_PROTOCOL_SIGNER_MINIMAL_BALANCE: Joi.number().default(1),
SESSION_SECRET: Joi.string().required(),
Expand Down
2 changes: 2 additions & 0 deletions libs/api/core/feature/src/lib/api-core-feature.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Module } from '@nestjs/common'
import { ApiAuthFeatureModule } from '@pubkey-network/api-auth-feature'
import { ApiCoreDataAccessModule } from '@pubkey-network/api-core-data-access'
import { ApiIdentityFeatureModule } from '@pubkey-network/api-identity-feature'
import { ApiOnboardingFeatureModule } from '@pubkey-network/api-onboarding-feature'
import { ApiProtocolFeatureModule } from '@pubkey-network/api-protocol-feature'
import { ApiSolanaFeatureModule } from '@pubkey-network/api-solana-feature'
import { ApiUserFeatureModule } from '@pubkey-network/api-user-feature'
Expand All @@ -13,6 +14,7 @@ const imports = [
ApiAuthFeatureModule,
ApiCoreDataAccessModule,
ApiIdentityFeatureModule,
ApiOnboardingFeatureModule,
ApiProtocolFeatureModule,
ApiSolanaFeatureModule,
ApiUserFeatureModule,
Expand Down
18 changes: 18 additions & 0 deletions libs/api/onboarding/data-access/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}
7 changes: 7 additions & 0 deletions libs/api/onboarding/data-access/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# api-onboarding-data-access

This library was generated with [Nx](https://nx.dev).

## Running unit tests

Run `nx test api-onboarding-data-access` to execute the unit tests via [Jest](https://jestjs.io).
11 changes: 11 additions & 0 deletions libs/api/onboarding/data-access/jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* eslint-disable */
export default {
displayName: 'api-onboarding-data-access',
preset: '../../../../jest.preset.js',
testEnvironment: 'node',
transform: {
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
},
moduleFileExtensions: ['ts', 'js', 'html'],
coverageDirectory: '../../../../coverage/libs/api/onboarding/data-access',
}
19 changes: 19 additions & 0 deletions libs/api/onboarding/data-access/project.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "api-onboarding-data-access",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "libs/api/onboarding/data-access/src",
"projectType": "library",
"tags": ["app:api", "type:data-access"],
"targets": {
"lint": {
"executor": "@nx/eslint:lint"
},
"test": {
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/api/onboarding/data-access/jest.config.ts"
}
}
}
}
4 changes: 4 additions & 0 deletions libs/api/onboarding/data-access/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export * from './lib/api-onboarding.data-access.module'
export * from './lib/api-onboarding.service'
export * from './lib/entity/onboarding-step'
export * from './lib/entity/onboarding.entity'
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common'
import { ApiCoreDataAccessModule } from '@pubkey-network/api-core-data-access'
import { ApiProtocolDataAccessModule } from '@pubkey-network/api-protocol-data-access'
import { ApiOnboardingService } from './api-onboarding.service'

@Module({
imports: [ApiCoreDataAccessModule, ApiProtocolDataAccessModule],
providers: [ApiOnboardingService],
exports: [ApiOnboardingService],
})
export class ApiOnboardingDataAccessModule {}
Loading
Loading