Skip to content

Commit

Permalink
Merge pull request #1434 from undb-xyz/release/v0.7.1
Browse files Browse the repository at this point in the history
  • Loading branch information
nichenqin committed Aug 14, 2023
2 parents e08af25 + 92d1137 commit 35b19e3
Show file tree
Hide file tree
Showing 304 changed files with 6,624 additions and 743 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
## v0.7.1

## v0.7.0

## v0.6.5
Expand Down
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ RUN pnpm install -r --prefer-offline

ARG PUBLIC_UNDB_ANALYTICS_DOMAIN
ARG PUBLIC_UNDB_ADMIN_EMAIL
ARG UNDB_HOST
ARG PUBLIC_UNDB_ADMIN_PASSWORD
ARG UNDB_SEED

Expand Down
7 changes: 6 additions & 1 deletion apps/backend/nest-cli.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src"
"sourceRoot": "src",
"compilerOptions": {
"builder": "swc",
"watchAssets": true,
"assets": ["**/*.hbs"]
}
}
6 changes: 6 additions & 0 deletions apps/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"@mikro-orm/core": "^5.7.14",
"@mikro-orm/migrations": "^5.7.14",
"@mikro-orm/nestjs": "^5.2.0",
"@nestjs-modules/mailer": "^1.9.1",
"@nestjs/axios": "^3.0.0",
"@nestjs/common": "^10.1.3",
"@nestjs/config": "^3.0.0",
"@nestjs/core": "^10.1.3",
Expand Down Expand Up @@ -42,6 +44,7 @@
"@undb/sqlite": "^0.0.0",
"@undb/trpc": "^0.0.0",
"aws-sdk-v3-nest": "^0.3.0",
"axios": "^1.4.0",
"bcrypt": "^5.1.0",
"better-sqlite3": "^8.5.0",
"class-transformer": "^0.5.1",
Expand All @@ -50,6 +53,7 @@
"cookie-parser": "^1.4.6",
"cron": "^2.4.0",
"got": "^13.0.0",
"handlebars": "^4.7.8",
"helmet": "^7.0.0",
"i18next": "^23.0.0",
"i18next-http-middleware": "^3.3.2",
Expand All @@ -59,6 +63,7 @@
"mongoose": "^7.4.1",
"nestjs-cls": "^3.5.0",
"nestjs-pino": "^3.3.0",
"nodemailer": "^6.9.4",
"oxide.ts": "^1.1.0",
"p-limit": "^4.0.0",
"passport": "^0.6.0",
Expand Down Expand Up @@ -89,6 +94,7 @@
"@types/jest": "^29.5.3",
"@types/multer": "^1.4.7",
"@types/node": "^20.4.6",
"@types/nodemailer": "^6.4.9",
"@types/passport": "^1.0.12",
"@types/passport-jwt": "^3.0.9",
"@types/passport-local": "^1.0.35",
Expand Down
6 changes: 5 additions & 1 deletion apps/backend/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import { coreModules } from './core/index.js'
import { UserService } from './core/user/user.service.js'
import { HealthModule } from './health/health.module.js'
import { I18nModule } from './i18n/i18n.module.js'
import { InvitationModule } from './invitation/invitation.module.js'
import { MailModule } from './mail/mail.module.js'
import { OpenAPIModule } from './openapi/openapi.module.js'
import { OutboxModule } from './outbox/outbox.module.js'
import { RealtimeModule } from './realtime/realtime.module.js'
Expand Down Expand Up @@ -57,7 +59,9 @@ import { WebhookModule } from './webhook/webhook.module.js'
}),
inject: [authConfig.KEY],
}),
AuthzModule,
TrpcModule,
MailModule.register({}),
LoggerModule.forRootAsync({
useFactory: (config: BaseConfigService) => ({
pinoHttp: {
Expand Down Expand Up @@ -85,7 +89,7 @@ import { WebhookModule } from './webhook/webhook.module.js'
ShareModule,
AuditModule,
AppInfoModule,
AuthzModule,
InvitationModule,
],
})
export class AppModule implements OnModuleInit {
Expand Down
6 changes: 4 additions & 2 deletions apps/backend/src/audit/events/audit-record.events-handler.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import { EventsHandler, IEventHandler } from '@nestjs/cqrs'
import { ClsStore, RecordEvents, RecordEventsClasses, isAnonymous } from '@undb/core'
import type { IEventHandler } from '@nestjs/cqrs'
import { EventsHandler } from '@nestjs/cqrs'
import type { ClsStore, RecordEvents } from '@undb/core'
import { RecordEventsClasses, isAnonymous } from '@undb/core'
import { AuditRecordEventsHandler } from '@undb/cqrs'
import { ClsService } from 'nestjs-cls'
import { InjectPinoLogger, PinoLogger } from 'nestjs-pino'
Expand Down
8 changes: 6 additions & 2 deletions apps/backend/src/auth/auth.controller.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { Body, Controller, Get, HttpCode, HttpStatus, Post, Put, Request, Res, UseGuards } from '@nestjs/common'
import { JwtService } from '@nestjs/jwt'
import { type Response } from 'express'
import { AuthzGuard } from '../authz/authz.guard.js'
import { AuthService } from './auth.service.js'
import { JwtAuthGuard } from './jwt-auth.guard.js'
import { LocalAuthGuard } from './local-auth.guard.js'

@Controller('auth')
export class AuthController {
constructor(private authService: AuthService, private jwtService: JwtService) {}
constructor(
private authService: AuthService,
private jwtService: JwtService,
) {}

@HttpCode(HttpStatus.OK)
@Post('register')
Expand Down Expand Up @@ -36,7 +40,7 @@ export class AuthController {
}

@HttpCode(HttpStatus.OK)
@UseGuards(JwtAuthGuard)
@UseGuards(JwtAuthGuard, AuthzGuard)
@Get('me')
getProfile(@Request() req: Express.Request) {
return this.authService.me(req.user as any)
Expand Down
3 changes: 2 additions & 1 deletion apps/backend/src/auth/auth.module.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Module } from '@nestjs/common'
import { CqrsModule } from '@nestjs/cqrs'
import { PassportModule } from '@nestjs/passport'
import { MemberModule } from '../authz/member/member.module.js'
import { UserModule } from '../core/user/user.module.js'
import { AuthController } from './auth.controller.js'
import { AuthService } from './auth.service.js'
Expand All @@ -17,7 +18,7 @@ const CommandHandlers = [NestLgoinCommandHandler, NestRegisterCommandHandler, Ne
const QueryHandlers = [NestGetMeQueryHandler]

@Module({
imports: [CqrsModule, UserModule, PassportModule],
imports: [CqrsModule, UserModule, PassportModule, MemberModule],
providers: [AuthService, LocalStrategy, JwtStrategy, ...CommandHandlers, ...QueryHandlers],
controllers: [AuthController],
})
Expand Down
9 changes: 7 additions & 2 deletions apps/backend/src/auth/commands/register.command.handler.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import { CommandHandler } from '@nestjs/cqrs'
import { type IUserRepository } from '@undb/core'
import { RegisterCommand, RegisterCommandHandler } from '@undb/cqrs'
import { NestMemberCreateService } from '../../authz/member/member-create.service.js'
import { InjectUserRepository } from '../../core/user/adapters/index.js'

@CommandHandler(RegisterCommand)
export class NestRegisterCommandHandler extends RegisterCommandHandler {
constructor(@InjectUserRepository() protected readonly repo: IUserRepository) {
super(repo)
constructor(
@InjectUserRepository()
protected readonly repo: IUserRepository,
protected readonly memberService: NestMemberCreateService,
) {
super(repo, memberService)
}
}
11 changes: 9 additions & 2 deletions apps/backend/src/auth/queries/get-me.query.handler.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
import { QueryHandler } from '@nestjs/cqrs'
import type { ClsStore, IClsService } from '@undb/core'
import { type IUserQueryModel } from '@undb/core'
import { GetMeQuery, GetMeQueryHandler } from '@undb/cqrs'
import { ClsService } from 'nestjs-cls'
import { InjectUserQueryModel } from '../../core/user/adapters/index.js'

@QueryHandler(GetMeQuery)
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
export class NestGetMeQueryHandler extends GetMeQueryHandler {
constructor(@InjectUserQueryModel() protected readonly rm: IUserQueryModel) {
super(rm)
constructor(
@InjectUserQueryModel() protected readonly rm: IUserQueryModel,
protected readonly cls: ClsService<ClsStore>,
) {
super(rm, cls as IClsService<ClsStore>)
}
}
22 changes: 22 additions & 0 deletions apps/backend/src/authz/authz.guard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import type { CanActivate, ExecutionContext } from '@nestjs/common'
import { Injectable } from '@nestjs/common'
import { Reflector } from '@nestjs/core'
import type { PermissionAction } from '@undb/authz'
import { NestMemberService } from './member/member.service.js'

@Injectable()
export class AuthzGuard implements CanActivate {
constructor(
private readonly memberService: NestMemberService,
private readonly reflect: Reflector,
) {}

async canActivate(context: ExecutionContext): Promise<boolean> {
await this.memberService.setCurrentMember()

const permissions = this.reflect.get<PermissionAction[]>('permissions', context.getHandler())
if (!permissions?.length) return true

return this.memberService.verify(permissions)
}
}
9 changes: 7 additions & 2 deletions apps/backend/src/authz/authz.module.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { Module } from '@nestjs/common'
import { Global, Module } from '@nestjs/common'
import { AuthzGuard } from './authz.guard.js'
import { MemberModule } from './member/member.module.js'
import { RLSModule } from './rls/rls.module.js'

@Global()
@Module({
imports: [RLSModule],
imports: [RLSModule, MemberModule],
providers: [AuthzGuard],
exports: [AuthzGuard],
})
export class AuthzModule {}
14 changes: 14 additions & 0 deletions apps/backend/src/authz/member/adapters/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { Provider } from '@nestjs/common'
import { MEMBER_QUERY_MODEL, NestMemberSqliteQueryModel } from './member-sqlite.query-model.js'
import { MEMBER_REPOSITORY, NestMemberSqliteRepository } from './member-sqlite.respository.js'

export const adapters: Provider[] = [
{
provide: MEMBER_REPOSITORY,
useClass: NestMemberSqliteRepository,
},
{
provide: MEMBER_QUERY_MODEL,
useClass: NestMemberSqliteQueryModel,
},
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { MikroORM, UseRequestContext } from '@mikro-orm/core'
import { Inject, Injectable } from '@nestjs/common'
import type { IQueryMember } from '@undb/authz'
import { type MemberSpecification } from '@undb/authz'
import { EntityManager, MemberSqliteQueryModel } from '@undb/sqlite'
import { Option } from 'oxide.ts'

export const MEMBER_QUERY_MODEL = Symbol('MEMBER_QUERY_MODEL')

export const InjectMemberQueryModel = () => Inject(MEMBER_QUERY_MODEL)

@Injectable()
export class NestMemberSqliteQueryModel extends MemberSqliteQueryModel {
constructor(
protected readonly orm: MikroORM,
protected readonly em: EntityManager,
) {
super(em)
}

@UseRequestContext()
find(spec: Option<MemberSpecification>): Promise<IQueryMember[]> {
return super.find(spec)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { MikroORM, UseRequestContext } from '@mikro-orm/core'
import { Inject, Injectable } from '@nestjs/common'
import { Member, type MemberSpecification } from '@undb/authz'
import { EntityManager, MemberSqliteRepository } from '@undb/sqlite'
import type { Option } from 'oxide.ts'

export const MEMBER_REPOSITORY = Symbol('MEMBER_REPOSITORY')

export const InjectMemberRespository = () => Inject(MEMBER_REPOSITORY)

@Injectable()
export class NestMemberSqliteRepository extends MemberSqliteRepository {
constructor(
protected readonly orm: MikroORM,
protected readonly em: EntityManager,
) {
super(em)
}

@UseRequestContext()
insert(member: Member): Promise<void> {
return super.insert(member)
}

@UseRequestContext()
findOne(spec: MemberSpecification): Promise<Option<Member>> {
return super.findOne(spec)
}

@UseRequestContext()
findOneById(id: string): Promise<Option<Member>> {
return super.findOneById(id)
}

@UseRequestContext()
updateOneById(id: string, spec: MemberSpecification): Promise<void> {
return super.updateOneById(id, spec)
}

@UseRequestContext()
count(): Promise<number> {
return super.count()
}
}
3 changes: 3 additions & 0 deletions apps/backend/src/authz/member/commands/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { NestUpdateRoleCommandHandler } from './update-role.command.handler.js'

export const commands = [NestUpdateRoleCommandHandler]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { ICommandHandler } from '@nestjs/cqrs'
import { CommandHandler } from '@nestjs/cqrs'
import { type IMemberRepository } from '@undb/authz'
import { UpdateRoleCommandHandler as DomainHandler, UpdateRoleCommand } from '@undb/cqrs'
import { InjectMemberRespository } from '../adapters/member-sqlite.respository.js'

@CommandHandler(UpdateRoleCommand)
export class NestUpdateRoleCommandHandler extends DomainHandler implements ICommandHandler<UpdateRoleCommand> {
constructor(
@InjectMemberRespository()
protected readonly repo: IMemberRepository,
) {
super(repo)
}
}
13 changes: 13 additions & 0 deletions apps/backend/src/authz/member/member-create.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Injectable } from '@nestjs/common'
import { MemberCreateService, type IMemberRepository } from '@undb/authz'
import { InjectMemberRespository } from './adapters/member-sqlite.respository.js'

@Injectable()
export class NestMemberCreateService extends MemberCreateService {
constructor(
@InjectMemberRespository()
protected readonly repo: IMemberRepository,
) {
super(repo)
}
}
15 changes: 15 additions & 0 deletions apps/backend/src/authz/member/member.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Global, Module } from '@nestjs/common'
import { CqrsModule } from '@nestjs/cqrs'
import { adapters } from './adapters/index.js'
import { commands } from './commands/index.js'
import { NestMemberCreateService } from './member-create.service.js'
import { NestMemberService } from './member.service.js'
import { queries } from './queries/index.js'

@Global()
@Module({
imports: [CqrsModule],
providers: [NestMemberCreateService, NestMemberService, ...adapters, ...queries, ...commands],
exports: [NestMemberCreateService, NestMemberService],
})
export class MemberModule {}
19 changes: 19 additions & 0 deletions apps/backend/src/authz/member/member.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Injectable } from '@nestjs/common'
import { MemberService, type IMemberRepository } from '@undb/authz'
import type { IClsService } from '@undb/core'
import { type ClsStore } from '@undb/core'
import { ClsService } from 'nestjs-cls'
import { InjectMemberRespository } from './adapters/member-sqlite.respository.js'

@Injectable()
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
export class NestMemberService extends MemberService {
constructor(
protected readonly cls: ClsService<ClsStore>,
@InjectMemberRespository()
protected readonly repo: IMemberRepository,
) {
super(cls as IClsService<ClsStore>, repo)
}
}
14 changes: 14 additions & 0 deletions apps/backend/src/authz/member/queries/get-members.query.handler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { QueryHandler } from '@nestjs/cqrs'
import { type IMemberQueryModel } from '@undb/authz'
import { GetMembersQuery, GetMembersQueryHandler } from '@undb/cqrs'
import { InjectMemberQueryModel } from '../adapters/member-sqlite.query-model.js'

@QueryHandler(GetMembersQuery)
export class NestGetMembersQueryHandler extends GetMembersQueryHandler {
constructor(
@InjectMemberQueryModel()
protected readonly rm: IMemberQueryModel,
) {
super(rm)
}
}
Loading

0 comments on commit 35b19e3

Please sign in to comment.