feat: Added methods for organization

This commit is contained in:
SauravDhakal
2026-03-11 21:47:35 +05:45
parent 6fc494687a
commit 349196b801
24 changed files with 504 additions and 189 deletions

View File

@@ -2,7 +2,23 @@ import { HttpException, HttpStatus } from '@nestjs/common';
// Base exception // Base exception
export class BaseException extends HttpException { export class BaseException extends HttpException {
protected constructor(code: string, message: string, status: HttpStatus) { protected constructor(
super({ code, message }, status); errorCode: string,
errorMessage: string,
status: HttpStatus
) {
super({ code: errorCode, message: errorMessage }, status);
} }
} }
/*
* Organization Exceptions
* */
export class OrganizationNotFoundException extends BaseException {
}
// export class NotPartOfOrganizationException extends BaseException {
// constructor(code: string, message: string, status: HttpStatus) {
// super();
// }
// }

View File

@@ -0,0 +1,17 @@
import { HttpStatus } from "@nestjs/common";
interface AppError {
errorCode: string,
message: string,
status: HttpStatus
}
type ErrorsType = Record<string, AppError>
export const ORGANIZATION_ERRORS: ErrorsType = {
NOT_FOUND: {
errorCode: 'ORG_001',
message: 'Organization not found',
status: HttpStatus.NOT_FOUND
}
}

View File

@@ -1,2 +1,5 @@
export const PUBLIC_KEY = '__PUBLIC_KEY__'; export const PUBLIC_KEY = '__PUBLIC_KEY__';
export const ROLE_KEY = '__ROLE_KEY__'; export const ROLE_KEY = '__ROLE_KEY__';
export const ORG_ROLE_KEY = '__ORG_ROLE_KEY__'
export const ORG_ROLES_ALL_KEY = '__ORG_ROLE_ALL_KEY__';
export const CAN_PERFORM_KEY = '__CAN_PERFORM_KEY__';

View File

@@ -47,4 +47,12 @@ export class RequestContextService {
get isTransaction(): boolean { get isTransaction(): boolean {
return !!this.get().tx; return !!this.get().tx;
} }
get orgId(): string {
return this.orgId
}
set orgId(id: string) {
this.set('orgId', id)
}
} }

View File

@@ -6,5 +6,6 @@ export interface RequestContext {
correlationId?: string; correlationId?: string;
headers: Record<string, string>; headers: Record<string, string>;
user?: JwtPayload; user?: JwtPayload;
orgId?: string;
tx?: Prisma.TransactionClient; tx?: Prisma.TransactionClient;
} }

View File

@@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = {
"clientVersion": "7.3.0", "clientVersion": "7.3.0",
"engineVersion": "9d6ad21cbbceab97458517b147a6a09ff43aa735", "engineVersion": "9d6ad21cbbceab97458517b147a6a09ff43aa735",
"activeProvider": "postgresql", "activeProvider": "postgresql",
"inlineSchema": "model OrganizationJoinRequest {\n userId String\n orgId String\n status ORGANIZATION_JOIN_REQUEST @default(PENDING)\n requestType ORGANIZATION_JOIN_REQUEST_TYPE\n requestedOn DateTime @default(now())\n role ORG_ROLE @default(member)\n updatedAt DateTime @updatedAt\n rejectReason String?\n requestMessage String?\n\n organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, orgId])\n @@map(\"organization_join_request\")\n}\n\nenum ORGANIZATION_JOIN_REQUEST {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n\nenum ORGANIZATION_JOIN_REQUEST_TYPE {\n INVITED\n REQUESTED\n}\n\nmodel OrganizationUserJoinTable {\n userId String\n orgId String\n role ORG_ROLE @default(member)\n joinedDate DateTime @default(now())\n\n organization Organization @relation(fields: [orgId], references: [id], onDelete: Restrict)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, orgId])\n @@map(\"organization_user_join\")\n}\n\nenum ORG_ROLE {\n owner\n admin\n member\n}\n\nmodel Organization {\n id String @id @default(uuid())\n name String\n description String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members OrganizationUserJoinTable[]\n requestingMembers OrganizationJoinRequest[]\n\n @@map(\"organization\")\n}\n\n// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(uuid())\n firstName String\n middleName String?\n lastName String\n email String @unique\n password String\n role USER_ROLE @default(user)\n isVerified Boolean? @default(false) // TODO: Email using queue\n refreshToken String?\n profilePicture String?\n isDeleted Boolean? @default(false)\n deletedAt DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n organizations OrganizationUserJoinTable[]\n organizationsRequested OrganizationJoinRequest[]\n\n @@map(\"user\")\n}\n\nenum USER_ROLE {\n superadmin\n user\n}\n", "inlineSchema": "model OrganizationJoinRequest {\n id String @id @default(uuid())\n userId String\n orgId String\n status ORGANIZATION_JOIN_REQUEST @default(PENDING)\n requestType ORGANIZATION_JOIN_REQUEST_TYPE\n requestedOn DateTime @default(now())\n role ORG_ROLE @default(member)\n updatedAt DateTime @updatedAt\n rejectReason String?\n requestMessage String?\n\n organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n // @@unique([userId, orgId])\n @@index([userId, orgId])\n @@map(\"organization_join_request\")\n}\n\nenum ORGANIZATION_JOIN_REQUEST {\n PENDING\n ACCEPTED\n REJECTED\n CANCELLED\n}\n\nenum ORGANIZATION_JOIN_REQUEST_TYPE {\n INVITED\n REQUESTED\n}\n\nmodel OrganizationUserJoinTable {\n userId String\n orgId String\n role ORG_ROLE @default(member)\n joinedDate DateTime @default(now())\n\n organization Organization @relation(fields: [orgId], references: [id], onDelete: Restrict)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([userId, orgId])\n @@map(\"organization_user_join\")\n}\n\nenum ORG_ROLE {\n owner\n admin\n member\n}\n\nmodel Organization {\n id String @id @default(uuid())\n name String\n description String?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n members OrganizationUserJoinTable[]\n requestingMembers OrganizationJoinRequest[]\n\n @@map(\"organization\")\n}\n\n// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id @default(uuid())\n firstName String\n middleName String?\n lastName String\n email String @unique\n password String\n role USER_ROLE @default(user)\n isVerified Boolean? @default(false) // TODO: Email using queue\n refreshToken String?\n profilePicture String?\n isDeleted Boolean? @default(false)\n deletedAt DateTime?\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n organizations OrganizationUserJoinTable[]\n organizationsRequested OrganizationJoinRequest[]\n\n @@map(\"user\")\n}\n\nenum USER_ROLE {\n superadmin\n user\n}\n",
"runtimeDataModel": { "runtimeDataModel": {
"models": {}, "models": {},
"enums": {}, "enums": {},
@@ -28,7 +28,7 @@ const config: runtime.GetPrismaClientConfig = {
} }
} }
config.runtimeDataModel = JSON.parse("{\"models\":{\"OrganizationJoinRequest\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"orgId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ORGANIZATION_JOIN_REQUEST\"},{\"name\":\"requestType\",\"kind\":\"enum\",\"type\":\"ORGANIZATION_JOIN_REQUEST_TYPE\"},{\"name\":\"requestedOn\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ORG_ROLE\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"rejectReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requestMessage\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"OrganizationToOrganizationJoinRequest\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"OrganizationJoinRequestToUser\"}],\"dbName\":\"organization_join_request\"},\"OrganizationUserJoinTable\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"orgId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ORG_ROLE\"},{\"name\":\"joinedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"OrganizationToOrganizationUserJoinTable\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"OrganizationUserJoinTableToUser\"}],\"dbName\":\"organization_user_join\"},\"Organization\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"OrganizationUserJoinTable\",\"relationName\":\"OrganizationToOrganizationUserJoinTable\"},{\"name\":\"requestingMembers\",\"kind\":\"object\",\"type\":\"OrganizationJoinRequest\",\"relationName\":\"OrganizationToOrganizationJoinRequest\"}],\"dbName\":\"organization\"},\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"middleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"USER_ROLE\"},{\"name\":\"isVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profilePicture\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDeleted\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"organizations\",\"kind\":\"object\",\"type\":\"OrganizationUserJoinTable\",\"relationName\":\"OrganizationUserJoinTableToUser\"},{\"name\":\"organizationsRequested\",\"kind\":\"object\",\"type\":\"OrganizationJoinRequest\",\"relationName\":\"OrganizationJoinRequestToUser\"}],\"dbName\":\"user\"}},\"enums\":{},\"types\":{}}") config.runtimeDataModel = JSON.parse("{\"models\":{\"OrganizationJoinRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"orgId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"ORGANIZATION_JOIN_REQUEST\"},{\"name\":\"requestType\",\"kind\":\"enum\",\"type\":\"ORGANIZATION_JOIN_REQUEST_TYPE\"},{\"name\":\"requestedOn\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ORG_ROLE\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"rejectReason\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"requestMessage\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"OrganizationToOrganizationJoinRequest\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"OrganizationJoinRequestToUser\"}],\"dbName\":\"organization_join_request\"},\"OrganizationUserJoinTable\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"orgId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ORG_ROLE\"},{\"name\":\"joinedDate\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"organization\",\"kind\":\"object\",\"type\":\"Organization\",\"relationName\":\"OrganizationToOrganizationUserJoinTable\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"OrganizationUserJoinTableToUser\"}],\"dbName\":\"organization_user_join\"},\"Organization\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"description\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"members\",\"kind\":\"object\",\"type\":\"OrganizationUserJoinTable\",\"relationName\":\"OrganizationToOrganizationUserJoinTable\"},{\"name\":\"requestingMembers\",\"kind\":\"object\",\"type\":\"OrganizationJoinRequest\",\"relationName\":\"OrganizationToOrganizationJoinRequest\"}],\"dbName\":\"organization\"},\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"middleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"USER_ROLE\"},{\"name\":\"isVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profilePicture\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDeleted\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"deletedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"organizations\",\"kind\":\"object\",\"type\":\"OrganizationUserJoinTable\",\"relationName\":\"OrganizationUserJoinTableToUser\"},{\"name\":\"organizationsRequested\",\"kind\":\"object\",\"type\":\"OrganizationJoinRequest\",\"relationName\":\"OrganizationJoinRequestToUser\"}],\"dbName\":\"user\"}},\"enums\":{},\"types\":{}}")
async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> { async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {
const { Buffer } = await import('node:buffer') const { Buffer } = await import('node:buffer')

View File

@@ -743,6 +743,7 @@ export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof
export const OrganizationJoinRequestScalarFieldEnum = { export const OrganizationJoinRequestScalarFieldEnum = {
id: 'id',
userId: 'userId', userId: 'userId',
orgId: 'orgId', orgId: 'orgId',
status: 'status', status: 'status',

View File

@@ -74,6 +74,7 @@ export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof
export const OrganizationJoinRequestScalarFieldEnum = { export const OrganizationJoinRequestScalarFieldEnum = {
id: 'id',
userId: 'userId', userId: 'userId',
orgId: 'orgId', orgId: 'orgId',
status: 'status', status: 'status',

View File

@@ -25,6 +25,7 @@ export type AggregateOrganizationJoinRequest = {
} }
export type OrganizationJoinRequestMinAggregateOutputType = { export type OrganizationJoinRequestMinAggregateOutputType = {
id: string | null
userId: string | null userId: string | null
orgId: string | null orgId: string | null
status: $Enums.ORGANIZATION_JOIN_REQUEST | null status: $Enums.ORGANIZATION_JOIN_REQUEST | null
@@ -37,6 +38,7 @@ export type OrganizationJoinRequestMinAggregateOutputType = {
} }
export type OrganizationJoinRequestMaxAggregateOutputType = { export type OrganizationJoinRequestMaxAggregateOutputType = {
id: string | null
userId: string | null userId: string | null
orgId: string | null orgId: string | null
status: $Enums.ORGANIZATION_JOIN_REQUEST | null status: $Enums.ORGANIZATION_JOIN_REQUEST | null
@@ -49,6 +51,7 @@ export type OrganizationJoinRequestMaxAggregateOutputType = {
} }
export type OrganizationJoinRequestCountAggregateOutputType = { export type OrganizationJoinRequestCountAggregateOutputType = {
id: number
userId: number userId: number
orgId: number orgId: number
status: number status: number
@@ -63,6 +66,7 @@ export type OrganizationJoinRequestCountAggregateOutputType = {
export type OrganizationJoinRequestMinAggregateInputType = { export type OrganizationJoinRequestMinAggregateInputType = {
id?: true
userId?: true userId?: true
orgId?: true orgId?: true
status?: true status?: true
@@ -75,6 +79,7 @@ export type OrganizationJoinRequestMinAggregateInputType = {
} }
export type OrganizationJoinRequestMaxAggregateInputType = { export type OrganizationJoinRequestMaxAggregateInputType = {
id?: true
userId?: true userId?: true
orgId?: true orgId?: true
status?: true status?: true
@@ -87,6 +92,7 @@ export type OrganizationJoinRequestMaxAggregateInputType = {
} }
export type OrganizationJoinRequestCountAggregateInputType = { export type OrganizationJoinRequestCountAggregateInputType = {
id?: true
userId?: true userId?: true
orgId?: true orgId?: true
status?: true status?: true
@@ -172,6 +178,7 @@ export type OrganizationJoinRequestGroupByArgs<ExtArgs extends runtime.Types.Ext
} }
export type OrganizationJoinRequestGroupByOutputType = { export type OrganizationJoinRequestGroupByOutputType = {
id: string
userId: string userId: string
orgId: string orgId: string
status: $Enums.ORGANIZATION_JOIN_REQUEST status: $Enums.ORGANIZATION_JOIN_REQUEST
@@ -205,6 +212,7 @@ export type OrganizationJoinRequestWhereInput = {
AND?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[] AND?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[]
OR?: Prisma.OrganizationJoinRequestWhereInput[] OR?: Prisma.OrganizationJoinRequestWhereInput[]
NOT?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[] NOT?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[]
id?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
userId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string userId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
orgId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string orgId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST
@@ -219,6 +227,7 @@ export type OrganizationJoinRequestWhereInput = {
} }
export type OrganizationJoinRequestOrderByWithRelationInput = { export type OrganizationJoinRequestOrderByWithRelationInput = {
id?: Prisma.SortOrder
userId?: Prisma.SortOrder userId?: Prisma.SortOrder
orgId?: Prisma.SortOrder orgId?: Prisma.SortOrder
status?: Prisma.SortOrder status?: Prisma.SortOrder
@@ -233,7 +242,7 @@ export type OrganizationJoinRequestOrderByWithRelationInput = {
} }
export type OrganizationJoinRequestWhereUniqueInput = Prisma.AtLeast<{ export type OrganizationJoinRequestWhereUniqueInput = Prisma.AtLeast<{
userId_orgId?: Prisma.OrganizationJoinRequestUserIdOrgIdCompoundUniqueInput id?: string
AND?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[] AND?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[]
OR?: Prisma.OrganizationJoinRequestWhereInput[] OR?: Prisma.OrganizationJoinRequestWhereInput[]
NOT?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[] NOT?: Prisma.OrganizationJoinRequestWhereInput | Prisma.OrganizationJoinRequestWhereInput[]
@@ -248,9 +257,10 @@ export type OrganizationJoinRequestWhereUniqueInput = Prisma.AtLeast<{
requestMessage?: Prisma.StringNullableFilter<"OrganizationJoinRequest"> | string | null requestMessage?: Prisma.StringNullableFilter<"OrganizationJoinRequest"> | string | null
organization?: Prisma.XOR<Prisma.OrganizationScalarRelationFilter, Prisma.OrganizationWhereInput> organization?: Prisma.XOR<Prisma.OrganizationScalarRelationFilter, Prisma.OrganizationWhereInput>
user?: Prisma.XOR<Prisma.UserScalarRelationFilter, Prisma.UserWhereInput> user?: Prisma.XOR<Prisma.UserScalarRelationFilter, Prisma.UserWhereInput>
}, "userId_orgId"> }, "id">
export type OrganizationJoinRequestOrderByWithAggregationInput = { export type OrganizationJoinRequestOrderByWithAggregationInput = {
id?: Prisma.SortOrder
userId?: Prisma.SortOrder userId?: Prisma.SortOrder
orgId?: Prisma.SortOrder orgId?: Prisma.SortOrder
status?: Prisma.SortOrder status?: Prisma.SortOrder
@@ -269,6 +279,7 @@ export type OrganizationJoinRequestScalarWhereWithAggregatesInput = {
AND?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput | Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[] AND?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput | Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[]
OR?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[] OR?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[]
NOT?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput | Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[] NOT?: Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput | Prisma.OrganizationJoinRequestScalarWhereWithAggregatesInput[]
id?: Prisma.StringWithAggregatesFilter<"OrganizationJoinRequest"> | string
userId?: Prisma.StringWithAggregatesFilter<"OrganizationJoinRequest"> | string userId?: Prisma.StringWithAggregatesFilter<"OrganizationJoinRequest"> | string
orgId?: Prisma.StringWithAggregatesFilter<"OrganizationJoinRequest"> | string orgId?: Prisma.StringWithAggregatesFilter<"OrganizationJoinRequest"> | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTWithAggregatesFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTWithAggregatesFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST
@@ -281,6 +292,7 @@ export type OrganizationJoinRequestScalarWhereWithAggregatesInput = {
} }
export type OrganizationJoinRequestCreateInput = { export type OrganizationJoinRequestCreateInput = {
id?: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Date | string requestedOn?: Date | string
@@ -293,6 +305,7 @@ export type OrganizationJoinRequestCreateInput = {
} }
export type OrganizationJoinRequestUncheckedCreateInput = { export type OrganizationJoinRequestUncheckedCreateInput = {
id?: string
userId: string userId: string
orgId: string orgId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
@@ -305,6 +318,7 @@ export type OrganizationJoinRequestUncheckedCreateInput = {
} }
export type OrganizationJoinRequestUpdateInput = { export type OrganizationJoinRequestUpdateInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
@@ -317,6 +331,7 @@ export type OrganizationJoinRequestUpdateInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateInput = { export type OrganizationJoinRequestUncheckedUpdateInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
userId?: Prisma.StringFieldUpdateOperationsInput | string userId?: Prisma.StringFieldUpdateOperationsInput | string
orgId?: Prisma.StringFieldUpdateOperationsInput | string orgId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
@@ -329,6 +344,7 @@ export type OrganizationJoinRequestUncheckedUpdateInput = {
} }
export type OrganizationJoinRequestCreateManyInput = { export type OrganizationJoinRequestCreateManyInput = {
id?: string
userId: string userId: string
orgId: string orgId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
@@ -341,6 +357,7 @@ export type OrganizationJoinRequestCreateManyInput = {
} }
export type OrganizationJoinRequestUpdateManyMutationInput = { export type OrganizationJoinRequestUpdateManyMutationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
@@ -351,6 +368,7 @@ export type OrganizationJoinRequestUpdateManyMutationInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateManyInput = { export type OrganizationJoinRequestUncheckedUpdateManyInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
userId?: Prisma.StringFieldUpdateOperationsInput | string userId?: Prisma.StringFieldUpdateOperationsInput | string
orgId?: Prisma.StringFieldUpdateOperationsInput | string orgId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
@@ -362,12 +380,8 @@ export type OrganizationJoinRequestUncheckedUpdateManyInput = {
requestMessage?: Prisma.NullableStringFieldUpdateOperationsInput | string | null requestMessage?: Prisma.NullableStringFieldUpdateOperationsInput | string | null
} }
export type OrganizationJoinRequestUserIdOrgIdCompoundUniqueInput = {
userId: string
orgId: string
}
export type OrganizationJoinRequestCountOrderByAggregateInput = { export type OrganizationJoinRequestCountOrderByAggregateInput = {
id?: Prisma.SortOrder
userId?: Prisma.SortOrder userId?: Prisma.SortOrder
orgId?: Prisma.SortOrder orgId?: Prisma.SortOrder
status?: Prisma.SortOrder status?: Prisma.SortOrder
@@ -380,6 +394,7 @@ export type OrganizationJoinRequestCountOrderByAggregateInput = {
} }
export type OrganizationJoinRequestMaxOrderByAggregateInput = { export type OrganizationJoinRequestMaxOrderByAggregateInput = {
id?: Prisma.SortOrder
userId?: Prisma.SortOrder userId?: Prisma.SortOrder
orgId?: Prisma.SortOrder orgId?: Prisma.SortOrder
status?: Prisma.SortOrder status?: Prisma.SortOrder
@@ -392,6 +407,7 @@ export type OrganizationJoinRequestMaxOrderByAggregateInput = {
} }
export type OrganizationJoinRequestMinOrderByAggregateInput = { export type OrganizationJoinRequestMinOrderByAggregateInput = {
id?: Prisma.SortOrder
userId?: Prisma.SortOrder userId?: Prisma.SortOrder
orgId?: Prisma.SortOrder orgId?: Prisma.SortOrder
status?: Prisma.SortOrder status?: Prisma.SortOrder
@@ -413,6 +429,10 @@ export type OrganizationJoinRequestOrderByRelationAggregateInput = {
_count?: Prisma.SortOrder _count?: Prisma.SortOrder
} }
export type StringFieldUpdateOperationsInput = {
set?: string
}
export type EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput = { export type EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput = {
set?: $Enums.ORGANIZATION_JOIN_REQUEST set?: $Enums.ORGANIZATION_JOIN_REQUEST
} }
@@ -433,10 +453,6 @@ export type NullableStringFieldUpdateOperationsInput = {
set?: string | null set?: string | null
} }
export type StringFieldUpdateOperationsInput = {
set?: string
}
export type OrganizationJoinRequestCreateNestedManyWithoutOrganizationInput = { export type OrganizationJoinRequestCreateNestedManyWithoutOrganizationInput = {
create?: Prisma.XOR<Prisma.OrganizationJoinRequestCreateWithoutOrganizationInput, Prisma.OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput> | Prisma.OrganizationJoinRequestCreateWithoutOrganizationInput[] | Prisma.OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput[] create?: Prisma.XOR<Prisma.OrganizationJoinRequestCreateWithoutOrganizationInput, Prisma.OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput> | Prisma.OrganizationJoinRequestCreateWithoutOrganizationInput[] | Prisma.OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput[]
connectOrCreate?: Prisma.OrganizationJoinRequestCreateOrConnectWithoutOrganizationInput | Prisma.OrganizationJoinRequestCreateOrConnectWithoutOrganizationInput[] connectOrCreate?: Prisma.OrganizationJoinRequestCreateOrConnectWithoutOrganizationInput | Prisma.OrganizationJoinRequestCreateOrConnectWithoutOrganizationInput[]
@@ -522,6 +538,7 @@ export type OrganizationJoinRequestUncheckedUpdateManyWithoutUserNestedInput = {
} }
export type OrganizationJoinRequestCreateWithoutOrganizationInput = { export type OrganizationJoinRequestCreateWithoutOrganizationInput = {
id?: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Date | string requestedOn?: Date | string
@@ -533,6 +550,7 @@ export type OrganizationJoinRequestCreateWithoutOrganizationInput = {
} }
export type OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput = { export type OrganizationJoinRequestUncheckedCreateWithoutOrganizationInput = {
id?: string
userId: string userId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -573,6 +591,7 @@ export type OrganizationJoinRequestScalarWhereInput = {
AND?: Prisma.OrganizationJoinRequestScalarWhereInput | Prisma.OrganizationJoinRequestScalarWhereInput[] AND?: Prisma.OrganizationJoinRequestScalarWhereInput | Prisma.OrganizationJoinRequestScalarWhereInput[]
OR?: Prisma.OrganizationJoinRequestScalarWhereInput[] OR?: Prisma.OrganizationJoinRequestScalarWhereInput[]
NOT?: Prisma.OrganizationJoinRequestScalarWhereInput | Prisma.OrganizationJoinRequestScalarWhereInput[] NOT?: Prisma.OrganizationJoinRequestScalarWhereInput | Prisma.OrganizationJoinRequestScalarWhereInput[]
id?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
userId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string userId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
orgId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string orgId?: Prisma.StringFilter<"OrganizationJoinRequest"> | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFilter<"OrganizationJoinRequest"> | $Enums.ORGANIZATION_JOIN_REQUEST
@@ -585,6 +604,7 @@ export type OrganizationJoinRequestScalarWhereInput = {
} }
export type OrganizationJoinRequestCreateWithoutUserInput = { export type OrganizationJoinRequestCreateWithoutUserInput = {
id?: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Date | string requestedOn?: Date | string
@@ -596,6 +616,7 @@ export type OrganizationJoinRequestCreateWithoutUserInput = {
} }
export type OrganizationJoinRequestUncheckedCreateWithoutUserInput = { export type OrganizationJoinRequestUncheckedCreateWithoutUserInput = {
id?: string
orgId: string orgId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -633,6 +654,7 @@ export type OrganizationJoinRequestUpdateManyWithWhereWithoutUserInput = {
} }
export type OrganizationJoinRequestCreateManyOrganizationInput = { export type OrganizationJoinRequestCreateManyOrganizationInput = {
id?: string
userId: string userId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -644,6 +666,7 @@ export type OrganizationJoinRequestCreateManyOrganizationInput = {
} }
export type OrganizationJoinRequestUpdateWithoutOrganizationInput = { export type OrganizationJoinRequestUpdateWithoutOrganizationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
@@ -655,6 +678,7 @@ export type OrganizationJoinRequestUpdateWithoutOrganizationInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateWithoutOrganizationInput = { export type OrganizationJoinRequestUncheckedUpdateWithoutOrganizationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
userId?: Prisma.StringFieldUpdateOperationsInput | string userId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -666,6 +690,7 @@ export type OrganizationJoinRequestUncheckedUpdateWithoutOrganizationInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateManyWithoutOrganizationInput = { export type OrganizationJoinRequestUncheckedUpdateManyWithoutOrganizationInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
userId?: Prisma.StringFieldUpdateOperationsInput | string userId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -677,6 +702,7 @@ export type OrganizationJoinRequestUncheckedUpdateManyWithoutOrganizationInput =
} }
export type OrganizationJoinRequestCreateManyUserInput = { export type OrganizationJoinRequestCreateManyUserInput = {
id?: string
orgId: string orgId: string
status?: $Enums.ORGANIZATION_JOIN_REQUEST status?: $Enums.ORGANIZATION_JOIN_REQUEST
requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType: $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -688,6 +714,7 @@ export type OrganizationJoinRequestCreateManyUserInput = {
} }
export type OrganizationJoinRequestUpdateWithoutUserInput = { export type OrganizationJoinRequestUpdateWithoutUserInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string requestedOn?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string
@@ -699,6 +726,7 @@ export type OrganizationJoinRequestUpdateWithoutUserInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateWithoutUserInput = { export type OrganizationJoinRequestUncheckedUpdateWithoutUserInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
orgId?: Prisma.StringFieldUpdateOperationsInput | string orgId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -710,6 +738,7 @@ export type OrganizationJoinRequestUncheckedUpdateWithoutUserInput = {
} }
export type OrganizationJoinRequestUncheckedUpdateManyWithoutUserInput = { export type OrganizationJoinRequestUncheckedUpdateManyWithoutUserInput = {
id?: Prisma.StringFieldUpdateOperationsInput | string
orgId?: Prisma.StringFieldUpdateOperationsInput | string orgId?: Prisma.StringFieldUpdateOperationsInput | string
status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST status?: Prisma.EnumORGANIZATION_JOIN_REQUESTFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST
requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE requestType?: Prisma.EnumORGANIZATION_JOIN_REQUEST_TYPEFieldUpdateOperationsInput | $Enums.ORGANIZATION_JOIN_REQUEST_TYPE
@@ -723,6 +752,7 @@ export type OrganizationJoinRequestUncheckedUpdateManyWithoutUserInput = {
export type OrganizationJoinRequestSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ export type OrganizationJoinRequestSelect<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
id?: boolean
userId?: boolean userId?: boolean
orgId?: boolean orgId?: boolean
status?: boolean status?: boolean
@@ -737,6 +767,7 @@ export type OrganizationJoinRequestSelect<ExtArgs extends runtime.Types.Extensio
}, ExtArgs["result"]["organizationJoinRequest"]> }, ExtArgs["result"]["organizationJoinRequest"]>
export type OrganizationJoinRequestSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ export type OrganizationJoinRequestSelectCreateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
id?: boolean
userId?: boolean userId?: boolean
orgId?: boolean orgId?: boolean
status?: boolean status?: boolean
@@ -751,6 +782,7 @@ export type OrganizationJoinRequestSelectCreateManyAndReturn<ExtArgs extends run
}, ExtArgs["result"]["organizationJoinRequest"]> }, ExtArgs["result"]["organizationJoinRequest"]>
export type OrganizationJoinRequestSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{ export type OrganizationJoinRequestSelectUpdateManyAndReturn<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetSelect<{
id?: boolean
userId?: boolean userId?: boolean
orgId?: boolean orgId?: boolean
status?: boolean status?: boolean
@@ -765,6 +797,7 @@ export type OrganizationJoinRequestSelectUpdateManyAndReturn<ExtArgs extends run
}, ExtArgs["result"]["organizationJoinRequest"]> }, ExtArgs["result"]["organizationJoinRequest"]>
export type OrganizationJoinRequestSelectScalar = { export type OrganizationJoinRequestSelectScalar = {
id?: boolean
userId?: boolean userId?: boolean
orgId?: boolean orgId?: boolean
status?: boolean status?: boolean
@@ -776,7 +809,7 @@ export type OrganizationJoinRequestSelectScalar = {
requestMessage?: boolean requestMessage?: boolean
} }
export type OrganizationJoinRequestOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"userId" | "orgId" | "status" | "requestType" | "requestedOn" | "role" | "updatedAt" | "rejectReason" | "requestMessage", ExtArgs["result"]["organizationJoinRequest"]> export type OrganizationJoinRequestOmit<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = runtime.Types.Extensions.GetOmit<"id" | "userId" | "orgId" | "status" | "requestType" | "requestedOn" | "role" | "updatedAt" | "rejectReason" | "requestMessage", ExtArgs["result"]["organizationJoinRequest"]>
export type OrganizationJoinRequestInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = { export type OrganizationJoinRequestInclude<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = {
organization?: boolean | Prisma.OrganizationDefaultArgs<ExtArgs> organization?: boolean | Prisma.OrganizationDefaultArgs<ExtArgs>
user?: boolean | Prisma.UserDefaultArgs<ExtArgs> user?: boolean | Prisma.UserDefaultArgs<ExtArgs>
@@ -797,6 +830,7 @@ export type $OrganizationJoinRequestPayload<ExtArgs extends runtime.Types.Extens
user: Prisma.$UserPayload<ExtArgs> user: Prisma.$UserPayload<ExtArgs>
} }
scalars: runtime.Types.Extensions.GetPayloadResult<{ scalars: runtime.Types.Extensions.GetPayloadResult<{
id: string
userId: string userId: string
orgId: string orgId: string
status: $Enums.ORGANIZATION_JOIN_REQUEST status: $Enums.ORGANIZATION_JOIN_REQUEST
@@ -889,8 +923,8 @@ export interface OrganizationJoinRequestDelegate<ExtArgs extends runtime.Types.E
* // Get first 10 OrganizationJoinRequests * // Get first 10 OrganizationJoinRequests
* const organizationJoinRequests = await prisma.organizationJoinRequest.findMany({ take: 10 }) * const organizationJoinRequests = await prisma.organizationJoinRequest.findMany({ take: 10 })
* *
* // Only select the `userId` * // Only select the `id`
* const organizationJoinRequestWithUserIdOnly = await prisma.organizationJoinRequest.findMany({ select: { userId: true } }) * const organizationJoinRequestWithIdOnly = await prisma.organizationJoinRequest.findMany({ select: { id: true } })
* *
*/ */
findMany<T extends OrganizationJoinRequestFindManyArgs>(args?: Prisma.SelectSubset<T, OrganizationJoinRequestFindManyArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$OrganizationJoinRequestPayload<ExtArgs>, T, "findMany", GlobalOmitOptions>> findMany<T extends OrganizationJoinRequestFindManyArgs>(args?: Prisma.SelectSubset<T, OrganizationJoinRequestFindManyArgs<ExtArgs>>): Prisma.PrismaPromise<runtime.Types.Result.GetResult<Prisma.$OrganizationJoinRequestPayload<ExtArgs>, T, "findMany", GlobalOmitOptions>>
@@ -934,9 +968,9 @@ export interface OrganizationJoinRequestDelegate<ExtArgs extends runtime.Types.E
* ] * ]
* }) * })
* *
* // Create many OrganizationJoinRequests and only return the `userId` * // Create many OrganizationJoinRequests and only return the `id`
* const organizationJoinRequestWithUserIdOnly = await prisma.organizationJoinRequest.createManyAndReturn({ * const organizationJoinRequestWithIdOnly = await prisma.organizationJoinRequest.createManyAndReturn({
* select: { userId: true }, * select: { id: true },
* data: [ * data: [
* // ... provide data here * // ... provide data here
* ] * ]
@@ -1025,9 +1059,9 @@ export interface OrganizationJoinRequestDelegate<ExtArgs extends runtime.Types.E
* ] * ]
* }) * })
* *
* // Update zero or more OrganizationJoinRequests and only return the `userId` * // Update zero or more OrganizationJoinRequests and only return the `id`
* const organizationJoinRequestWithUserIdOnly = await prisma.organizationJoinRequest.updateManyAndReturn({ * const organizationJoinRequestWithIdOnly = await prisma.organizationJoinRequest.updateManyAndReturn({
* select: { userId: true }, * select: { id: true },
* where: { * where: {
* // ... provide filter here * // ... provide filter here
* }, * },
@@ -1231,6 +1265,7 @@ export interface Prisma__OrganizationJoinRequestClient<T, Null = never, ExtArgs
* Fields of the OrganizationJoinRequest model * Fields of the OrganizationJoinRequest model
*/ */
export interface OrganizationJoinRequestFieldRefs { export interface OrganizationJoinRequestFieldRefs {
readonly id: Prisma.FieldRef<"OrganizationJoinRequest", 'String'>
readonly userId: Prisma.FieldRef<"OrganizationJoinRequest", 'String'> readonly userId: Prisma.FieldRef<"OrganizationJoinRequest", 'String'>
readonly orgId: Prisma.FieldRef<"OrganizationJoinRequest", 'String'> readonly orgId: Prisma.FieldRef<"OrganizationJoinRequest", 'String'>
readonly status: Prisma.FieldRef<"OrganizationJoinRequest", 'ORGANIZATION_JOIN_REQUEST'> readonly status: Prisma.FieldRef<"OrganizationJoinRequest", 'ORGANIZATION_JOIN_REQUEST'>

View File

@@ -0,0 +1,15 @@
/*
Warnings:
- The required column `id` was added to the `organization_join_request` table with a prisma-level default value. This is not possible if the table is not empty. Please add this column as optional, then populate it before making it required.
*/
-- DropIndex
DROP INDEX "organization_join_request_userId_orgId_key";
-- AlterTable
ALTER TABLE "organization_join_request" ADD COLUMN "id" TEXT NOT NULL,
ADD CONSTRAINT "organization_join_request_pkey" PRIMARY KEY ("id");
-- CreateIndex
CREATE INDEX "organization_join_request_userId_orgId_idx" ON "organization_join_request"("userId", "orgId");

View File

@@ -1,4 +1,5 @@
model OrganizationJoinRequest { model OrganizationJoinRequest {
id String @id @default(uuid())
userId String userId String
orgId String orgId String
status ORGANIZATION_JOIN_REQUEST @default(PENDING) status ORGANIZATION_JOIN_REQUEST @default(PENDING)
@@ -12,7 +13,8 @@ model OrganizationJoinRequest {
organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade) organization Organization @relation(fields: [orgId], references: [id], onDelete: Cascade)
user User @relation(fields: [userId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([userId, orgId]) // @@unique([userId, orgId])
@@index([userId, orgId])
@@map("organization_join_request") @@map("organization_join_request")
} }

View File

@@ -0,0 +1,16 @@
import { applyDecorators, SetMetadata, UseGuards } from "@nestjs/common";
import { CAN_PERFORM_KEY } from "common/keys";
import { ORG_ROLE } from "prisma/generated/prisma/enums";
import { AuthorizationGuard } from "../guards";
/*
*Is this user part of the organization (And optionally, has required role)
* */
export function Authorization(role?: ORG_ROLE[]) {
return applyDecorators(
SetMetadata(CAN_PERFORM_KEY, role),
UseGuards(AuthorizationGuard)
)
}
//export const Authorization = (role?: ORG_ROLE[]) => SetMetadata(CAN_PERFORM_KEY, role)

View File

@@ -1,2 +1,3 @@
export * from './public.decorator'; export * from './public.decorator';
export * from './role.decorator'; export * from './role.decorator';
export * from './authorization.decorator';

View File

@@ -1,4 +1,6 @@
import { SetMetadata } from '@nestjs/common'; import { SetMetadata } from '@nestjs/common';
import { ROLE_KEY } from 'common/keys'; import { ORG_ROLE_KEY, ROLE_KEY } from 'common/keys';
export const Roles = (role: string) => SetMetadata(ROLE_KEY, role); export const Roles = (role: string) => SetMetadata(ROLE_KEY, role);
export const OrgRole = (role: string) => SetMetadata(ORG_ROLE_KEY, role);

View File

@@ -0,0 +1,57 @@
import {
BadRequestException,
CanActivate,
ExecutionContext,
ForbiddenException,
Injectable,
UnauthorizedException
} from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { CAN_PERFORM_KEY } from "common/keys";
import { RequestContextService } from "core/als/request-context.service";
import { ORG_ROLE } from "prisma/generated/prisma/enums";
import { PrismaService } from "src/prisma/prisma.service";
@Injectable()
export class AuthorizationGuard implements CanActivate {
constructor(
private readonly reqeustContext: RequestContextService,
private readonly reflector: Reflector,
private readonly prisma: PrismaService,
) { };
async canActivate(context: ExecutionContext): Promise<boolean> {
const requiredRole = this.reflector.getAllAndOverride<ORG_ROLE[] | undefined>(
CAN_PERFORM_KEY,
[context.getHandler(), context.getClass()]
)
const userId = this.reqeustContext.user.userId;
if (!userId)
throw new UnauthorizedException()
const request = context.switchToHttp().getRequest()
const orgId = request.params.orgId;
if (!orgId)
throw new BadRequestException()
const userIsPartOfOrg = await this.prisma.organizationUserJoinTable.findUnique({
where: {
userId_orgId: {
userId,
orgId
},
...(requiredRole ? { role: { in: requiredRole } } : {})
},
select: {
userId: true
}
})
if (!userIsPartOfOrg)
throw new ForbiddenException()
this.reqeustContext.orgId = orgId;
return true;
}
}

View File

@@ -0,0 +1 @@
export * from "./authorization.guard"

View File

@@ -11,7 +11,7 @@ export class RbacGuard implements CanActivate {
constructor( constructor(
private readonly reflector: Reflector, private readonly reflector: Reflector,
private readonly requestContext: RequestContextService, private readonly requestContext: RequestContextService,
) {} ) { }
canActivate(context: ExecutionContext) { canActivate(context: ExecutionContext) {
const requiredRole = this.reflector.getAllAndOverride<string>(ROLE_KEY, [ const requiredRole = this.reflector.getAllAndOverride<string>(ROLE_KEY, [
context.getHandler(), context.getHandler(),

View File

@@ -1,3 +1,4 @@
export * from './invite-to-org.dto'; export * from './invite-to-org.dto';
export * from './join-request.dto' export * from './join-request.dto'
export * from "./user-invitation-action.dto" export * from "./user-invitation-action.dto"
export * from "./org-request-action.dto"

View File

@@ -21,3 +21,14 @@ export class InviteUserToOrganizationRequestDTO {
@IsNotEmpty() @IsNotEmpty()
role: ORG_ROLE; role: ORG_ROLE;
} }
export class CancelInviteUserToOrganizationRequestDTO {
@ApiProperty({
description: 'Who to cancel',
example: 'bb1c81da-ce8f-4231-aee8-2b976124a589',
type: 'string',
})
@IsUUID()
@IsNotEmpty()
userId: string;
}

View File

@@ -0,0 +1,23 @@
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"
import { IsEnum, IsNotEmpty, IsOptional, IsString } from "class-validator"
import { USER_ORG_ACCEPT_REJECT_ACTION } from "../constants"
export class UserOrganizationRequestActionRequestDTO {
@ApiProperty({
description: 'Action',
example: USER_ORG_ACCEPT_REJECT_ACTION.ACCEPT,
type: 'string',
})
@IsEnum(USER_ORG_ACCEPT_REJECT_ACTION)
@IsNotEmpty()
action: USER_ORG_ACCEPT_REJECT_ACTION
@ApiPropertyOptional({
description: 'Message(reject reason)',
example: 'Bad sry or smth',
type: 'string',
})
@IsString()
@IsOptional()
message?: string
}

View File

@@ -1,5 +1,5 @@
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger"; import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { IsEnum, IsNotEmpty, IsOptional, IsString, IsUUID } from "class-validator"; import { IsEnum, IsNotEmpty, IsOptional, IsString } from "class-validator";
import { USER_ORG_ACCEPT_REJECT_ACTION } from "../constants"; import { USER_ORG_ACCEPT_REJECT_ACTION } from "../constants";

View File

@@ -2,8 +2,9 @@ import { Body, Controller, Delete, Get, Param, ParseEnumPipe, ParseUUIDPipe, Pat
import { OrganizationMembershipService } from './organization-membership.service'; import { OrganizationMembershipService } from './organization-membership.service';
import { RequestContextService } from 'core/als/request-context.service'; import { RequestContextService } from 'core/als/request-context.service';
import { ApiBearerAuth, ApiOperation, ApiParam, ApiQuery } from '@nestjs/swagger'; import { ApiBearerAuth, ApiOperation, ApiParam, ApiQuery } from '@nestjs/swagger';
import { JoinRequestToOrganizationRequestDTO, UserOrganizationInvitationActionRequestDTO } from './dto'; import { CancelInviteUserToOrganizationRequestDTO, InviteUserToOrganizationRequestDTO, JoinRequestToOrganizationRequestDTO, UserOrganizationInvitationActionRequestDTO, UserOrganizationRequestActionRequestDTO } from './dto';
import { ORGANIZATION_JOIN_REQUEST_TYPE } from 'prisma/generated/prisma/enums'; import { ORG_ROLE, ORGANIZATION_JOIN_REQUEST_TYPE } from 'prisma/generated/prisma/enums';
import { Authorization } from 'src/auth/decorators';
/* NOTE: Regarding endpoint path naming /* NOTE: Regarding endpoint path naming
* - Since we follow REST style, endpoint are resource based. * - Since we follow REST style, endpoint are resource based.
@@ -42,10 +43,17 @@ export class OrganizationMembershipController {
name: 'orgId', name: 'orgId',
type: String, type: String,
}) })
@Delete('organization/:orgId/join-request') @Delete('organization/:orgId/join-request/:id')
async cancelRequestToJoinOrg(@Param('orgId', new ParseUUIDPipe()) orgId: string) { async cancelRequestToJoinOrg(
@Param('orgId', new ParseUUIDPipe()) orgId: string,
@Param('id', new ParseUUIDPipe()) joinReqId: string
) {
const user = this.requestContext.user; const user = this.requestContext.user;
return await this.orgMemService.userCancelOrgJoinRequest(user.userId, orgId) return await this.orgMemService.userCancelOrgJoinRequest(
user.userId,
orgId,
joinReqId
)
} }
@ApiOperation({ summary: 'Accept or reject an invitation from an organization' }) @ApiOperation({ summary: 'Accept or reject an invitation from an organization' })
@@ -53,15 +61,17 @@ export class OrganizationMembershipController {
name: 'orgId', name: 'orgId',
type: String, type: String,
}) })
@Patch('organization/:orgId/invitation') @Patch('organization/:orgId/invitation/:id')
async acceptOrRejectInvitation( async acceptOrRejectInvitation(
@Param('orgId', new ParseUUIDPipe()) orgId: string, @Param('orgId', new ParseUUIDPipe()) orgId: string,
@Param('id', new ParseUUIDPipe()) invitationId: string,
@Body() body: UserOrganizationInvitationActionRequestDTO @Body() body: UserOrganizationInvitationActionRequestDTO
) { ) {
const user = this.requestContext.user; const user = this.requestContext.user;
return await this.orgMemService.userOrganiaztionRequestAction( return await this.orgMemService.userOrganiaztionRequestAction(
user.userId, user.userId,
orgId, orgId,
invitationId,
body body
) )
} }
@@ -110,36 +120,66 @@ export class OrganizationMembershipController {
* ORGANIZATION OPERATIONS * ORGANIZATION OPERATIONS
* */ * */
// @ApiOperation({ summary: 'Invite user to organization' }) @ApiOperation({ summary: 'Invite user to organization' })
// @ApiParam({ @ApiParam({
// name: 'orgId', name: 'orgId',
// type: String, type: String,
// }) })
// @Post('organization/:orgId/invitation') @Authorization([ORG_ROLE.admin, ORG_ROLE.owner])
// async inviteUserToOrg( @Post('organization/:orgId/invitation')
// @Param('orgId', new ParseUUIDPipe()) orgId: string, async inviteUserToOrg(
// @Body() body: InviteUserToOrganizationRequestDTO @Param('orgId', new ParseUUIDPipe()) orgId: string,
// ) { @Body() body: InviteUserToOrganizationRequestDTO
// const user = this.requestContext.user; ) {
// return await this.orgMemService.inviteUserToOrg( return await this.orgMemService.inviteUserToOrg(
// user.userId, orgId,
// orgId, body
// body );
// ); }
// }
// @Get('organization/:id/members') @ApiOperation({ summary: 'Cancel a sent invitation to user' })
// async getOrganizationMemebers(@Param('id') orgId: string) { @ApiParam({
// return await this.orgMemService.getMemebersOfOrganization(orgId); name: 'userId',
// } type: String,
// })
// @Get('organization/:id/invitations') @Authorization([ORG_ROLE.admin, ORG_ROLE.owner])
// async getOrganizationInvitations(@Param('id') orgId: string) { @Delete('organization/:orgId/invitation/:id')
// return await this.orgMemService.getOrganizationRequestList(orgId); async cancelInvitationsToUser(
// } @Param('orgId', new ParseUUIDPipe()) orgId: string,
// @Param('id', new ParseUUIDPipe()) invitationId: string,
// @Patch('organization/:id/accept-request') @Body() body: CancelInviteUserToOrganizationRequestDTO
// acceptJoinRequest() { } ) {
// const userId = body.userId;
// @Patch('organization/:id/reject-request') return await this.orgMemService.orgCancelUserInviteRequest(userId, orgId, invitationId)
// rejectJoinRequest() { } }
@Get('organization/:orgId/members')
@Authorization()
async getOrganizationMemebers(@Param('orgId') orgId: string) {
const user = this.requestContext.user;
return await this.orgMemService.getMemebersOfOrganization(user.userId, orgId);
}
@Get('organization/:orgId/invitations')
@Authorization([ORG_ROLE.admin, ORG_ROLE.owner])
async getOrganizationInvitations(@Param('orgId') orgId: string) {
const user = this.requestContext.user;
return await this.orgMemService.getOrganizationRequestList(user.userId, orgId);
}
@Patch('organization/:orgId/request/:id')
@Authorization([ORG_ROLE.admin, ORG_ROLE.owner])
async acceptOrRejectRequest(
@Param('orgId', new ParseUUIDPipe()) orgId: string,
@Param('id', new ParseUUIDPipe()) invitationId: string,
@Body() body: UserOrganizationRequestActionRequestDTO
) {
const user = this.requestContext.user;
return await this.orgMemService.organizationUserJoinRequestAction(
user.userId,
orgId,
invitationId,
body
)
}
} }

View File

@@ -6,7 +6,7 @@ import {
} from '@nestjs/common'; } from '@nestjs/common';
import { OrganizationService } from 'src/organization/organization.service'; import { OrganizationService } from 'src/organization/organization.service';
import { UserService } from 'src/user/user.service'; import { UserService } from 'src/user/user.service';
import { InviteUserToOrganizationRequestDTO, UserOrganizationInvitationActionRequestDTO } from './dto'; import { InviteUserToOrganizationRequestDTO, UserOrganizationInvitationActionRequestDTO, UserOrganizationRequestActionRequestDTO } from './dto';
import { PrismaService } from 'src/prisma/prisma.service'; import { PrismaService } from 'src/prisma/prisma.service';
import { import {
ORGANIZATION_JOIN_REQUEST, ORGANIZATION_JOIN_REQUEST,
@@ -26,60 +26,6 @@ export class OrganizationMembershipService {
private readonly prisma: PrismaService, private readonly prisma: PrismaService,
private readonly authorization: AuthorizationService, private readonly authorization: AuthorizationService,
) { } ) { }
async inviteUserToOrg(
userId: string,
orgId: string,
dto: InviteUserToOrganizationRequestDTO,
) {
const { invitedUserEmail, ...rest } = dto;
const [orgExists, invitedUser] = await Promise.all([
this.orgService.findById(orgId),
this.userService.findByEmail(invitedUserEmail),
]);
if (!orgExists) throw new NotFoundException('Organization');
if (!invitedUser) throw new NotFoundException('User');
const userAlreadyPart =
await this.prisma.organizationUserJoinTable.findUnique({
where: {
userId_orgId: {
orgId: orgId,
userId: invitedUser.id,
},
},
});
if (userAlreadyPart)
throw new BadRequestException('User already part of this organization');
const canInviteUser = await this.authorization.canPerformOperation(
userId,
orgId,
USER_ORGANIZATION_OPERATIONS.INVITE_USERS,
);
if (!canInviteUser) throw new ForbiddenException('Insufficient Permission');
try {
const invitation = await this.prisma.organizationJoinRequest.create({
data: {
...rest,
userId: invitedUser.id,
orgId,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE.INVITED,
},
});
return invitation;
} catch (err) {
if (err instanceof Prisma.PrismaClientKnownRequestError) {
if (err.code === 'P2002')
throw new BadRequestException('User invitation already sent.');
} else {
throw err;
}
}
}
/* * /* *
* USER OPERATIONS * USER OPERATIONS
@@ -95,22 +41,17 @@ export class OrganizationMembershipService {
userAlreadyPartOf userAlreadyPartOf
] = await Promise.all([ ] = await Promise.all([
this.orgService.findById(orgId), this.orgService.findById(orgId),
this.prisma.organizationJoinRequest.findUnique({ this.prisma.organizationJoinRequest.findFirst({
where: { where: {
userId_orgId: { orgId,
userId, userId,
orgId: orgId
},
status: ORGANIZATION_JOIN_REQUEST.PENDING status: ORGANIZATION_JOIN_REQUEST.PENDING
}, },
select: { orgId: true }
}), }),
this.prisma.organizationUserJoinTable.findUnique({ this.prisma.organizationUserJoinTable.findFirst({
where: { where: {
userId_orgId: { orgId,
orgId: orgId, userId,
userId
}
}, },
select: { userId: true } select: { userId: true }
}) })
@@ -136,16 +77,16 @@ export class OrganizationMembershipService {
async userCancelOrgJoinRequest( async userCancelOrgJoinRequest(
userId: string, userId: string,
orgId: string orgId: string,
id: string,
) { ) {
try { try {
await this.prisma.organizationJoinRequest.update({ await this.prisma.organizationJoinRequest.update({
where: { where: {
userId_orgId: { id,
userId, userId,
orgId orgId
}, },
},
data: { data: {
status: ORGANIZATION_JOIN_REQUEST.CANCELLED, status: ORGANIZATION_JOIN_REQUEST.CANCELLED,
} }
@@ -174,8 +115,9 @@ export class OrganizationMembershipService {
return await this.prisma.organizationJoinRequest.findMany({ return await this.prisma.organizationJoinRequest.findMany({
where: { where: {
userId, userId,
requestType: joinReqType requestType: joinReqType,
} },
include: { user: { select: { firstName: true, email: true } } }
}) })
} }
@@ -183,24 +125,19 @@ export class OrganizationMembershipService {
async userOrganiaztionRequestAction( async userOrganiaztionRequestAction(
userId: string, userId: string,
orgId: string, orgId: string,
id: string,
dto: UserOrganizationInvitationActionRequestDTO dto: UserOrganizationInvitationActionRequestDTO
) { ) {
const [orgExists, hasUserSendRequest] = await Promise.all([ const hasUserSendRequest = await this.prisma.organizationJoinRequest.findUnique({
this.orgService.findById(orgId),
this.prisma.organizationJoinRequest.findUnique({
where: { where: {
userId_orgId: { id,
userId, userId,
orgId: orgId orgId,
},
status: ORGANIZATION_JOIN_REQUEST.PENDING, status: ORGANIZATION_JOIN_REQUEST.PENDING,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE.REQUESTED requestType: ORGANIZATION_JOIN_REQUEST_TYPE.REQUESTED
} }
}) })
])
if (!orgExists)
throw new NotFoundException("Organization")
if (!hasUserSendRequest) if (!hasUserSendRequest)
throw new BadRequestException("No pending join request") throw new BadRequestException("No pending join request")
@@ -212,10 +149,9 @@ export class OrganizationMembershipService {
await tx.organizationJoinRequest.update({ await tx.organizationJoinRequest.update({
where: { where: {
userId_orgId: { id,
userId, userId,
orgId: orgId, orgId,
}
}, },
data: { data: {
status: userAction, status: userAction,
@@ -322,9 +258,9 @@ export class OrganizationMembershipService {
} }
async getOrganizationsOfUser(userId: string) { async getOrganizationsOfUser(userId: string) {
return await this.prisma.organizationJoinRequest.findMany({ return await this.prisma.organizationUserJoinTable.findMany({
where: { where: {
userId userId,
}, },
include: { include: {
organization: { organization: {
@@ -351,41 +287,166 @@ export class OrganizationMembershipService {
return true; return true;
} }
async inviteUserToOrg(
orgId: string,
dto: InviteUserToOrganizationRequestDTO,
) {
const { invitedUserEmail, ...rest } = dto;
const invitedUser = await this.userService.findByEmail(invitedUserEmail);
if (!invitedUser) throw new NotFoundException('User');
const userAlreadyPart =
await this.prisma.organizationUserJoinTable.findUnique({
where: {
userId_orgId: {
orgId: orgId,
userId: invitedUser.id,
},
},
});
if (userAlreadyPart)
throw new BadRequestException('User already part of this organization');
// TODO: Test in Authorization and remove
// const canInviteUser = await this.authorization.canPerformOperation(
// userId,
// orgId,
// USER_ORGANIZATION_OPERATIONS.INVITE_USERS,
// );
// if (!canInviteUser) throw new ForbiddenException('Insufficient Permission');
try {
const invitation = await this.prisma.organizationJoinRequest.create({
data: {
...rest,
userId: invitedUser.id,
orgId,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE.INVITED,
},
});
return invitation;
} catch (err) {
if (err instanceof Prisma.PrismaClientKnownRequestError) {
if (err.code === 'P2002')
throw new BadRequestException('User invitation already sent.');
} else {
throw err;
}
}
}
async orgCancelUserInviteRequest(
userId: string,
orgId: string,
id: string,
) {
try {
return await this.prisma.organizationJoinRequest.update({
where: {
id,
userId,
orgId,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE.INVITED,
status: ORGANIZATION_JOIN_REQUEST.PENDING
},
data: {
status: ORGANIZATION_JOIN_REQUEST.CANCELLED
}
})
}
catch (err) {
// TODO: Check error type and use it
throw new BadRequestException("Invitation not found")
}
}
async organizationUserJoinRequestAction(
userId: string,
orgId: string,
id: string,
dto: UserOrganizationRequestActionRequestDTO
) {
// NOTE: Experiment, don't know if its better
try {
return await this.prisma.$transaction(async (tx) => {
const updatedJoinReq = await tx.organizationJoinRequest.update({
where: {
id,
orgId,
status: ORGANIZATION_JOIN_REQUEST.PENDING,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE.REQUESTED
},
data: {
status: dto.action === USER_ORG_ACCEPT_REJECT_ACTION.ACCEPT
? ORGANIZATION_JOIN_REQUEST.ACCEPTED
: ORGANIZATION_JOIN_REQUEST.REJECTED,
...((dto.action === USER_ORG_ACCEPT_REJECT_ACTION.REJECT && dto.message) ? {
rejectReason: dto.message
} : {})
}
});
console.log(updatedJoinReq)
return await tx.organizationUserJoinTable.create({
data: {
userId: updatedJoinReq.userId,
orgId,
}
})
})
}
catch (err) {
console.log(err);
throw new BadRequestException()
}
}
async getOrganizationRequestList( async getOrganizationRequestList(
userId: string,
orgId: string, orgId: string,
requestType: ORGANIZATION_JOIN_REQUEST_TYPE = ORGANIZATION_JOIN_REQUEST_TYPE.REQUESTED, requestType: ORGANIZATION_JOIN_REQUEST_TYPE = ORGANIZATION_JOIN_REQUEST_TYPE.REQUESTED,
status: ORGANIZATION_JOIN_REQUEST = ORGANIZATION_JOIN_REQUEST.PENDING,
) { ) {
// TODO: Check can perform // TODO: Check can perform
return await this.prisma.organizationJoinRequest.findMany({ return await this.prisma.organizationJoinRequest.findMany({
where: { where: {
orgId: orgId, orgId,
status: status, requestType: requestType
requestType: requestType, }
}, })
include: {
user: {
select: { email: true },
},
},
});
} }
async getMemebersOfOrganization(orgId: string) {
const orgExists = await this.orgService.findById(orgId);
if (!orgExists) throw new NotFoundException('Organization');
return await this.prisma.organizationUserJoinTable.findMany({ async getMemebersOfOrganization(userId: string, orgId: string) {
const members = await this.prisma.organization.findFirst({
where: { where: {
orgId: orgId, id: orgId,
members: {
some: {
userId: userId
}
}
}, },
include: {
members: {
include: { include: {
user: { user: {
select: { select: {
email: true, firstName: true,
email: true
}
}
}, },
}
}, },
}, })
});
if (!members)
throw new NotFoundException("Organization")
return members;
} }
} }

View File

@@ -6,6 +6,7 @@ import {
Param, Param,
Post, Post,
Put, Put,
UseGuards,
} from '@nestjs/common'; } from '@nestjs/common';
import { import {
CreateNewOrganizationRequestDTO, CreateNewOrganizationRequestDTO,
@@ -16,6 +17,7 @@ import { OrganizationService } from './organization.service';
import { RequestContextService } from 'core/als/request-context.service'; import { RequestContextService } from 'core/als/request-context.service';
import { ApiBearerAuth } from '@nestjs/swagger'; import { ApiBearerAuth } from '@nestjs/swagger';
import { DataResponse } from 'common/http'; import { DataResponse } from 'common/http';
import { AuthorizationGuard } from 'src/auth/guards';
@Controller('organization') @Controller('organization')
@ApiBearerAuth('access-token') @ApiBearerAuth('access-token')
@@ -23,7 +25,7 @@ export class OrganizationController {
constructor( constructor(
private readonly orgService: OrganizationService, private readonly orgService: OrganizationService,
private readonly requestContext: RequestContextService, private readonly requestContext: RequestContextService,
) {} ) { }
@Post('') @Post('')
async createNewOrganization( async createNewOrganization(
@@ -50,17 +52,18 @@ export class OrganizationController {
); );
} }
@Get(':id') @Get(':orgId')
@UseGuards(AuthorizationGuard)
async getAnOrganization( async getAnOrganization(
@Param('id') id: string, @Param('orgId') orgId: string,
): Promise<DataResponse<OrganizationDTO>> { ): Promise<DataResponse<OrganizationDTO>> {
const organization = await this.orgService.getOrganizationById(id); const organization = await this.orgService.getOrganizationById(orgId);
return new DataResponse(new OrganizationDTO(organization)); return new DataResponse(new OrganizationDTO(organization));
} }
@Put(':id') @Put(':orgId')
async updateAnOrganization( async updateAnOrganization(
@Param('id') orgId: string, @Param('orgId') orgId: string,
@Body() body: UpdateOrganizationRequestDTO, @Body() body: UpdateOrganizationRequestDTO,
): Promise<DataResponse<OrganizationDTO>> { ): Promise<DataResponse<OrganizationDTO>> {
const user = this.requestContext.user; const user = this.requestContext.user;
@@ -76,9 +79,9 @@ export class OrganizationController {
); );
} }
@Delete(':id') @Delete(':orgId')
async deleteAnOrganization( async deleteAnOrganization(
@Param('id') orgId: string, @Param('orgId') orgId: string,
): Promise<DataResponse<OrganizationDTO>> { ): Promise<DataResponse<OrganizationDTO>> {
const user = this.requestContext.user; const user = this.requestContext.user;
const deletedOrg = await this.orgService.deleteAnOrganization( const deletedOrg = await this.orgService.deleteAnOrganization(