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:
2024-12-01 19:18:20 +07:00
parent 111acacf2d
commit 561823225d
10 changed files with 206 additions and 96 deletions

View File

@@ -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())
}