feat: integrate LiveKit services into Collaboration and Meeting Room modules
- Added LiveKitModule to CollaborationSession and MeetingRoom modules for enhanced real-time collaboration features. - Updated CollaborationSessionSchema to include LiveKit services for managing participant access and room permissions. - Implemented a new cron job in CronService to disable services without schedules for over 30 days, improving service management. - Enhanced GraphQL schema generation with improved filtering logic for better performance and readability. - Refactored LiveKit services to streamline access token creation and room management functionalities.
This commit is contained in:
@@ -1,6 +1,13 @@
|
||||
import { Inject, Injectable } from '@nestjs/common'
|
||||
|
||||
import { type BaseEnum, type EnumRef, InputObjectRef, type InputType, type InputTypeParam, type SchemaTypes } from '@pothos/core'
|
||||
import {
|
||||
type BaseEnum,
|
||||
type EnumRef,
|
||||
InputObjectRef,
|
||||
type InputType,
|
||||
type InputTypeParam,
|
||||
type SchemaTypes,
|
||||
} from '@pothos/core'
|
||||
import { type PrismaModelTypes, getModel } from '@pothos/plugin-prisma'
|
||||
import type { FilterOps } from '@pothos/plugin-prisma-utils'
|
||||
import * as Prisma from '@prisma/client'
|
||||
@@ -76,18 +83,27 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
const withoutFields = model.fields.filter((field) => without?.includes(field.name))
|
||||
|
||||
model.fields
|
||||
.filter((field) => !withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)))
|
||||
.filter(
|
||||
(field) =>
|
||||
!withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)),
|
||||
)
|
||||
.forEach((field) => {
|
||||
let type
|
||||
switch (field.kind) {
|
||||
case 'scalar':
|
||||
type = field.isList ? this.getScalarListFilter(this.mapScalarType(field.type) as InputType<Types>) : this.getFilter(this.mapScalarType(field.type) as InputType<Types>)
|
||||
type = field.isList
|
||||
? this.getScalarListFilter(this.mapScalarType(field.type) as InputType<Types>)
|
||||
: this.getFilter(this.mapScalarType(field.type) as InputType<Types>)
|
||||
break
|
||||
case 'enum':
|
||||
type = field.isList ? this.getScalarListFilter(this.getEnum(field.type)) : this.getFilter(this.getEnum(field.type))
|
||||
type = field.isList
|
||||
? this.getScalarListFilter(this.getEnum(field.type))
|
||||
: this.getFilter(this.getEnum(field.type))
|
||||
break
|
||||
case 'object':
|
||||
type = field.isList ? this.getListFilter(this.getWhere(field.type as Name)) : this.getWhere(field.type as Name)
|
||||
type = field.isList
|
||||
? this.getListFilter(this.getWhere(field.type as Name))
|
||||
: this.getWhere(field.type as Name)
|
||||
break
|
||||
case 'unsupported':
|
||||
break
|
||||
@@ -117,7 +133,13 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
const fields: Record<string, InputType<Types>> = {}
|
||||
|
||||
model.fields
|
||||
.filter((field) => field.isUnique || field.isId || model.uniqueIndexes.some((index) => index.fields.includes(field.name)) || model.primaryKey?.fields.includes(field.name))
|
||||
.filter(
|
||||
(field) =>
|
||||
field.isUnique ||
|
||||
field.isId ||
|
||||
model.uniqueIndexes.some((index) => index.fields.includes(field.name)) ||
|
||||
model.primaryKey?.fields.includes(field.name),
|
||||
)
|
||||
.forEach((field) => {
|
||||
let type
|
||||
switch (field.kind) {
|
||||
@@ -197,7 +219,11 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
const relationIds = model.fields.flatMap((field) => field.relationFromFields ?? [])
|
||||
|
||||
model.fields
|
||||
.filter((field) => !withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) && !relationIds.includes(field.name))
|
||||
.filter(
|
||||
(field) =>
|
||||
!withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) &&
|
||||
!relationIds.includes(field.name),
|
||||
)
|
||||
.forEach((field) => {
|
||||
let type
|
||||
switch (field.kind) {
|
||||
@@ -227,17 +253,22 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
})
|
||||
}
|
||||
|
||||
getCreateRelationInput<Name extends string & keyof Types['PrismaTypes'], Relation extends Model['RelationName'], Model extends PrismaModelTypes = Types['PrismaTypes'][Name] extends PrismaModelTypes ? Types['PrismaTypes'][Name] : never>(
|
||||
modelName: Name,
|
||||
relation: Relation,
|
||||
) {
|
||||
getCreateRelationInput<
|
||||
Name extends string & keyof Types['PrismaTypes'],
|
||||
Relation extends Model['RelationName'],
|
||||
Model extends PrismaModelTypes = Types['PrismaTypes'][Name] extends PrismaModelTypes
|
||||
? Types['PrismaTypes'][Name]
|
||||
: never,
|
||||
>(modelName: Name, relation: Relation) {
|
||||
return this.getRef(`${modelName}${capitalize(relation)}`, 'CreateRelationInput', () => {
|
||||
const model = getModel(modelName, this.builder)
|
||||
return this.builder.prismaCreateRelation(modelName, relation, {
|
||||
fields: () => {
|
||||
const relationField = model.fields.find((field) => field.name === relation)!
|
||||
const relatedModel = getModel(relationField.type, this.builder)
|
||||
const relatedFieldName = relatedModel.fields.find((field) => field.relationName === relationField.relationName)!
|
||||
const relatedFieldName = relatedModel.fields.find(
|
||||
(field) => field.relationName === relationField.relationName,
|
||||
)!
|
||||
|
||||
return {
|
||||
create: this.getCreateInput(relationField.type as Name, [relatedFieldName.name]),
|
||||
@@ -263,7 +294,11 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
const relationIds = model.fields.flatMap((field) => field.relationFromFields ?? [])
|
||||
|
||||
model.fields
|
||||
.filter((field) => !withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) && !relationIds.includes(field.name))
|
||||
.filter(
|
||||
(field) =>
|
||||
!withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) &&
|
||||
!relationIds.includes(field.name),
|
||||
)
|
||||
.forEach((field) => {
|
||||
let type
|
||||
switch (field.kind) {
|
||||
@@ -304,7 +339,11 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
const relationIds = model.fields.flatMap((field) => field.relationFromFields ?? [])
|
||||
|
||||
model.fields
|
||||
.filter((field) => !withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) && !relationIds.includes(field.name))
|
||||
.filter(
|
||||
(field) =>
|
||||
!withoutFields.some((f) => f.name === field.name || f.relationFromFields?.includes(field.name)) &&
|
||||
!relationIds.includes(field.name),
|
||||
)
|
||||
.forEach((field) => {
|
||||
let type
|
||||
switch (field.kind) {
|
||||
@@ -333,17 +372,22 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
}) as InputObjectRef<Types, (PrismaModelTypes & Types['PrismaTypes'][Name])['Update']>
|
||||
})
|
||||
}
|
||||
getUpdateRelationInput<Name extends string & keyof Types['PrismaTypes'], Relation extends Model['RelationName'], Model extends PrismaModelTypes = Types['PrismaTypes'][Name] extends PrismaModelTypes ? Types['PrismaTypes'][Name] : never>(
|
||||
modelName: Name,
|
||||
relation: Relation,
|
||||
) {
|
||||
getUpdateRelationInput<
|
||||
Name extends string & keyof Types['PrismaTypes'],
|
||||
Relation extends Model['RelationName'],
|
||||
Model extends PrismaModelTypes = Types['PrismaTypes'][Name] extends PrismaModelTypes
|
||||
? Types['PrismaTypes'][Name]
|
||||
: never,
|
||||
>(modelName: Name, relation: Relation) {
|
||||
return this.getRef(`${modelName}${capitalize(relation)}`, 'UpdateRelationInput', () => {
|
||||
const model = getModel(modelName, this.builder)
|
||||
return this.builder.prismaUpdateRelation(modelName, relation, {
|
||||
fields: () => {
|
||||
const relationField = model.fields.find((field) => field.name === relation)!
|
||||
const relatedModel = getModel(relationField.type, this.builder)
|
||||
const relatedFieldName = relatedModel.fields.find((field) => field.relationName === relationField.relationName)!.name
|
||||
const relatedFieldName = relatedModel.fields.find(
|
||||
(field) => field.relationName === relationField.relationName,
|
||||
)!.name
|
||||
|
||||
if (relationField.isList) {
|
||||
return {
|
||||
@@ -446,7 +490,11 @@ export class PrismaCrudGenerator<Types extends SchemaTypes> {
|
||||
}
|
||||
}
|
||||
|
||||
private getRef<T extends InputObjectRef<Types, unknown>>(key: InputType<Types> | string, name: string, create: () => T): T {
|
||||
private getRef<T extends InputObjectRef<Types, unknown>>(
|
||||
key: InputType<Types> | string,
|
||||
name: string,
|
||||
create: () => T,
|
||||
): T {
|
||||
if (!this.refCache.has(key)) {
|
||||
this.refCache.set(key, new Map())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user