From 9518ebee950d1db089865377ef7710133657cead Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Thu, 13 Mar 2025 09:11:59 +0000 Subject: [PATCH] chore(server): add pro user for testing with extended workspace member limit (#10827) --- docs/developing-server.md | 14 ++++- .../backend/server/src/core/auth/service.ts | 63 ++++++++++++------- .../src/core/workspaces/resolvers/service.ts | 11 +++- 3 files changed, 63 insertions(+), 25 deletions(-) diff --git a/docs/developing-server.md b/docs/developing-server.md index 99bd751ec3..ba7f5176ea 100644 --- a/docs/developing-server.md +++ b/docs/developing-server.md @@ -51,12 +51,24 @@ yarn affine server data-migration run yarn affine server dev ``` -when server started, it will created a default user for testing: +when server started, it will created a default user and a pro user for testing: + +### default user + +Workspace members up to 3 - email: dev@affine.pro - name: Dev User - password: dev +### pro user + +Workspace members up to 10 + +- email: pro@affine.pro +- name: Pro User +- password: pro + ## Start frontend ```sh diff --git a/packages/backend/server/src/core/auth/service.ts b/packages/backend/server/src/core/auth/service.ts index c6aff40c77..3aede5a09e 100644 --- a/packages/backend/server/src/core/auth/service.ts +++ b/packages/backend/server/src/core/auth/service.ts @@ -3,7 +3,12 @@ import type { CookieOptions, Request, Response } from 'express'; import { assign, pick } from 'lodash-es'; import { Config, MailService, SignUpForbidden } from '../../base'; -import { Models, type User, type UserSession } from '../../models'; +import { + Models, + type User, + type UserFeatureName, + type UserSession, +} from '../../models'; import { FeatureService } from '../features'; import type { CurrentUser } from './session'; @@ -48,28 +53,42 @@ export class AuthService implements OnApplicationBootstrap { async onApplicationBootstrap() { if (this.config.node.dev) { - try { - const [email, name, password] = ['dev@affine.pro', 'Dev User', 'dev']; - let devUser = await this.models.user.getUserByEmail(email); - if (!devUser) { - devUser = await this.models.user.create({ - email, - name, - password, - }); + const devUsers: { + email: string; + name: string; + password: string; + features: UserFeatureName[]; + }[] = [ + { + email: 'dev@affine.pro', + name: 'Dev User', + password: 'dev', + features: ['free_plan_v1', 'unlimited_copilot', 'administrator'], + }, + { + email: 'pro@affine.pro', + name: 'Pro User', + password: 'pro', + features: ['pro_plan_v1', 'unlimited_copilot', 'administrator'], + }, + ]; + + for (const { email, name, password, features } of devUsers) { + try { + let devUser = await this.models.user.getUserByEmail(email); + if (!devUser) { + devUser = await this.models.user.create({ + email, + name, + password, + }); + } + for (const feature of features) { + await this.models.userFeature.add(devUser.id, feature, name); + } + } catch { + // ignore } - await this.models.userFeature.add( - devUser.id, - 'administrator', - 'dev user' - ); - await this.models.userFeature.add( - devUser.id, - 'unlimited_copilot', - 'dev user' - ); - } catch { - // ignore } } } diff --git a/packages/backend/server/src/core/workspaces/resolvers/service.ts b/packages/backend/server/src/core/workspaces/resolvers/service.ts index 832c532157..1a38099213 100644 --- a/packages/backend/server/src/core/workspaces/resolvers/service.ts +++ b/packages/backend/server/src/core/workspaces/resolvers/service.ts @@ -3,6 +3,7 @@ import { getStreamAsBuffer } from 'get-stream'; import { Cache, + Config, MailService, NotFound, OnEvent, @@ -33,7 +34,8 @@ export class WorkspaceService { private readonly doc: DocReader, private readonly mailer: MailService, private readonly models: Models, - private readonly url: URLHelper + private readonly url: URLHelper, + private readonly config: Config ) {} async getInviteInfo(inviteId: string): Promise { @@ -134,10 +136,15 @@ export class WorkspaceService { const owner = await this.models.workspaceUser.getOwner(target.workspace.id); + const inviteUrl = this.url.link(`/invite/${inviteId}`); + if (this.config.node.dev) { + // make it easier to test in dev mode + this.logger.debug(`Invite link: ${inviteUrl}`); + } await this.mailer.sendMemberInviteMail(target.email, { workspace: target.workspace, user: owner, - url: this.url.link(`/invite/${inviteId}`), + url: inviteUrl, }); }