refactor(server): plugin modules (#5630)

- [x] separates modules into `fundamental`, `core`, `plugins`
- [x] optional modules with `@OptionalModule` decorator to install modules with requirements met(`requires`, `if`)
- [x] `module.contributesTo` defines optional features that will be enabled if module registered
- [x] `AFFiNE.plugins.use('payment', {})` to enable a optional/plugin module
- [x] `PaymentModule` is the first plugin module
- [x] GraphQLSchema will not be generated for non-included modules
- [x] Frontend can use `ServerConfigType` query to detect which features are enabled
- [x] override existing provider globally
This commit is contained in:
liuyi
2024-01-22 07:40:28 +00:00
parent ae8401b6f4
commit e516e0db23
130 changed files with 1297 additions and 974 deletions

View File

@@ -13,6 +13,9 @@ import { RevertCommand, RunCommand } from './commands/run';
enableUpdateAutoMerging: false,
},
},
metrics: {
enabled: false,
},
}),
BusinessAppModule,
],

View File

@@ -8,7 +8,7 @@ export class SelfHostAdmin1605053000403 {
// do the migration
static async up(db: PrismaClient, ref: ModuleRef) {
const config = ref.get(Config, { strict: false });
if (config.flavor === 'selfhosted') {
if (config.flavor.selfhosted) {
if (
!process.env.AFFINE_ADMIN_EMAIL ||
!process.env.AFFINE_ADMIN_PASSWORD

View File

@@ -1,7 +1,7 @@
import { PrismaClient } from '@prisma/client';
import { applyUpdate, Doc, encodeStateAsUpdate } from 'yjs';
import { DocID } from '../../modules/utils/doc';
import { DocID } from '../../core/utils/doc';
export class Guid1698398506533 {
// do the migration

View File

@@ -1,7 +1,7 @@
import { PrismaClient } from '@prisma/client';
import { Features } from '../../modules/features';
import { Quotas } from '../../modules/quota/schema';
import { Features } from '../../core/features';
import { Quotas } from '../../core/quota/schema';
import { migrateNewFeatureTable, upsertFeature } from './utils/user-features';
export class UserFeaturesInit1698652531198 {

View File

@@ -1,6 +1,6 @@
import { PrismaClient } from '@prisma/client';
import { QuotaType } from '../../modules/quota/types';
import { QuotaType } from '../../core/quota/types';
export class OldUserFeature1702620653283 {
// do the migration
static async up(db: PrismaClient) {

View File

@@ -1,6 +1,4 @@
import { PrismaClient } from '@prisma/client';
import type { UserType } from '../../modules/users';
import { PrismaClient, type User } from '@prisma/client';
export class UnamedAccount1703756315970 {
// do the migration
@@ -8,7 +6,7 @@ export class UnamedAccount1703756315970 {
await db.$transaction(async tx => {
// only find users with empty names
const users = await db.$queryRaw<
UserType[]
User[]
>`SELECT * FROM users WHERE name ~ E'^[\\s\\u2000-\\u200F]*$';`;
console.log(
`renaming ${users.map(({ email }) => email).join('|')} users`

View File

@@ -1,7 +1,7 @@
import { ModuleRef } from '@nestjs/core';
import { PrismaClient } from '@prisma/client';
import { WorkspaceBlobStorage } from '../../modules/storage';
import { WorkspaceBlobStorage } from '../../core/storage';
export class WorkspaceBlobs1703828796699 {
// do the migration

View File

@@ -1,6 +1,6 @@
import { PrismaClient } from '@prisma/client';
import { Features } from '../../modules/features';
import { Features } from '../../core/features';
import { upsertFeature } from './utils/user-features';
export class RefreshUserFeatures1704352562369 {

View File

@@ -1,7 +1,7 @@
import { PrismaClient } from '@prisma/client';
import { FeatureKind } from '../../modules/features';
import { Quotas } from '../../modules/quota';
import { FeatureKind } from '../../core/features';
import { Quotas } from '../../core/quota';
import { upsertFeature } from './utils/user-features';
export class NewFreePlan1705395933447 {

View File

@@ -4,7 +4,7 @@ import {
CommonFeature,
FeatureKind,
FeatureType,
} from '../../../modules/features';
} from '../../../core/features';
// upgrade features from lower version to higher version
export async function upsertFeature(