From bd9e79c3b607ee1a84112d8ba5b2ba4808158146 Mon Sep 17 00:00:00 2001 From: Ramesh Date: Wed, 5 Mar 2025 17:56:48 +0545 Subject: [PATCH 1/2] chore: code cleanup --- packages/fastify/src/index.ts | 4 +- .../fastify/src/model/accounts/service.ts | 40 +++++-------------- .../fastify/src/model/accounts/sqlFactory.ts | 29 +++----------- .../src/plugins/accountDiscoveryPlugin.ts | 3 ++ 4 files changed, 22 insertions(+), 54 deletions(-) diff --git a/packages/fastify/src/index.ts b/packages/fastify/src/index.ts index 54f012bb..87c34a1d 100644 --- a/packages/fastify/src/index.ts +++ b/packages/fastify/src/index.ts @@ -11,8 +11,8 @@ declare module "fastify" { } interface FastifyRequest { - authEmailPrefix?: string; - account?: Account; + authEmailPrefix: string | undefined; + account: Account | undefined; } interface FastifyContextConfig { diff --git a/packages/fastify/src/model/accounts/service.ts b/packages/fastify/src/model/accounts/service.ts index 45e12727..149dcf56 100644 --- a/packages/fastify/src/model/accounts/service.ts +++ b/packages/fastify/src/model/accounts/service.ts @@ -16,14 +16,14 @@ import type { Service } from "@dzangolab/fastify-slonik"; import type { QueryResultRow } from "slonik"; class AccountService< - Account extends QueryResultRow, - AccountCreateInput extends QueryResultRow, - AccountUpdateInput extends QueryResultRow, + T extends QueryResultRow, + C extends QueryResultRow, + U extends QueryResultRow, > - extends BaseService - implements Service + extends BaseService + implements Service { - create = async (data: AccountCreateInput): Promise => { + create = async (data: C): Promise => { if (this.saasConfig.subdomains === "disabled" || data.slug === "") { delete data.slug; delete data.domain; @@ -61,12 +61,12 @@ class AccountService< return connection.query(query).then((data) => { return data.rows[0]; }); - })) as Account; + })) as T; return result ? this.postCreate(result) : undefined; }; - findByHostname = async (hostname: string): Promise => { + findByHostname = async (hostname: string): Promise => { const saasConfig = getSaasConfig(this.config); const query = this.factory.getFindByHostnameSql( @@ -81,16 +81,6 @@ class AccountService< return account; }; - findByUserId = async (userId: string): Promise => { - const query = this.factory.getFindByUserIdSql(userId); - - const account = await this.database.connect(async (connection) => { - return connection.maybeOne(query); - }); - - return account; - }; - validateSlugOrDomain = async (slug: string, domain?: string) => { const query = this.factory.getFindBySlugOrDomainSql(slug, domain); @@ -121,18 +111,10 @@ class AccountService< } if (!this._factory) { - this._factory = new AccountSqlFactory< - Account, - AccountCreateInput, - AccountUpdateInput - >(this); + this._factory = new AccountSqlFactory(this); } - return this._factory as AccountSqlFactory< - Account, - AccountCreateInput, - AccountUpdateInput - >; + return this._factory as AccountSqlFactory; } get saasConfig() { @@ -143,7 +125,7 @@ class AccountService< return this.saasConfig.tables.accounts.name; } - protected postCreate = async (account: Account): Promise => { + protected postCreate = async (account: T): Promise => { if ( this.saasConfig.subdomains === "disabled" || !this.saasConfig.multiDatabase?.enabled diff --git a/packages/fastify/src/model/accounts/sqlFactory.ts b/packages/fastify/src/model/accounts/sqlFactory.ts index 5d5dfafc..f41e5cea 100644 --- a/packages/fastify/src/model/accounts/sqlFactory.ts +++ b/packages/fastify/src/model/accounts/sqlFactory.ts @@ -1,7 +1,4 @@ -import { - createTableFragment, - DefaultSqlFactory, -} from "@dzangolab/fastify-slonik"; +import { DefaultSqlFactory } from "@dzangolab/fastify-slonik"; import { sql } from "slonik"; import getSaasConfig from "../../config"; @@ -11,12 +8,12 @@ import type { QueryResultRow, QuerySqlToken } from "slonik"; /* eslint-disable brace-style */ class AccountSqlFactory< - Account extends QueryResultRow, - AccountCreateInput extends QueryResultRow, - AccountUpdateInput extends QueryResultRow, + T extends QueryResultRow, + C extends QueryResultRow, + U extends QueryResultRow, > - extends DefaultSqlFactory - implements SqlFactory + extends DefaultSqlFactory + implements SqlFactory { getFindByHostnameSql = ( hostname: string, @@ -55,20 +52,6 @@ class AccountSqlFactory< `; }; - getFindByUserIdSql = (userId: string): QuerySqlToken => { - const accountUsersTable = createTableFragment( - this.saasConfig.tables.accountUsers.name, - this.schema, - ); - - return sql.type(this.validationSchema)` - SELECT c.* - FROM ${this.getTableFragment()} AS c - JOIN ${accountUsersTable} AS cu on c.id = cu.account_id - WHERE cu.user_id = ${userId}; - `; - }; - get saasConfig() { return getSaasConfig(this.config); } diff --git a/packages/fastify/src/plugins/accountDiscoveryPlugin.ts b/packages/fastify/src/plugins/accountDiscoveryPlugin.ts index 8cf6ff32..7b39d25c 100644 --- a/packages/fastify/src/plugins/accountDiscoveryPlugin.ts +++ b/packages/fastify/src/plugins/accountDiscoveryPlugin.ts @@ -8,6 +8,9 @@ import getHost from "../lib/getHost"; import type { FastifyInstance, FastifyRequest, FastifyReply } from "fastify"; const plugin = async (fastify: FastifyInstance) => { + fastify.decorateRequest("account"); + fastify.decorateRequest("authEmailPrefix"); + fastify.addHook( "onRequest", async (request: FastifyRequest, reply: FastifyReply) => { From 2bd8bd72a758523301846c990aa4852d33ad45d8 Mon Sep 17 00:00:00 2001 From: Ramesh Date: Wed, 5 Mar 2025 17:58:22 +0545 Subject: [PATCH 2/2] feat: add role in my-account and my-accounts response --- .../src/model/accounts/handlers/myAccount.ts | 36 +++++++++++++++++-- .../src/model/accounts/handlers/myAccounts.ts | 9 ++++- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/fastify/src/model/accounts/handlers/myAccount.ts b/packages/fastify/src/model/accounts/handlers/myAccount.ts index 141d5aeb..141ee970 100644 --- a/packages/fastify/src/model/accounts/handlers/myAccount.ts +++ b/packages/fastify/src/model/accounts/handlers/myAccount.ts @@ -1,8 +1,20 @@ +import AccountUserService from "../../accountUsers/service"; + import type { FastifyReply } from "fastify"; import type { SessionRequest } from "supertokens-node/framework/fastify"; const myAccount = async (request: SessionRequest, reply: FastifyReply) => { - if (!request.account) { + const { account, config, dbSchema, slonik, user } = request; + + if (!user) { + return reply.status(401).send({ + error: "Unauthorized", + message: "unauthorized", + statusCode: 401, + }); + } + + if (!account) { return reply.status(400).send({ error: "Bad Request", message: "Bad Request", @@ -10,7 +22,27 @@ const myAccount = async (request: SessionRequest, reply: FastifyReply) => { }); } - reply.send(request.account); + const accountUserService = new AccountUserService(config, slonik, dbSchema); + + const accountUser = await accountUserService.findOne({ + AND: [ + { + key: "user_id", + operator: "eq", + value: user.id, + }, + { + key: "account_id", + operator: "eq", + value: account.id, + }, + ], + }); + + reply.send({ + ...account, + role: accountUser?.roleId, + }); }; export default myAccount; diff --git a/packages/fastify/src/model/accounts/handlers/myAccounts.ts b/packages/fastify/src/model/accounts/handlers/myAccounts.ts index 3672abfe..9add789b 100644 --- a/packages/fastify/src/model/accounts/handlers/myAccounts.ts +++ b/packages/fastify/src/model/accounts/handlers/myAccounts.ts @@ -33,7 +33,14 @@ const myAccounts = async (request: SessionRequest, reply: FastifyReply) => { .join(","), }); - reply.send(accounts); + const accountsWithRole = accounts.map((account) => ({ + ...account, + role: + accountUsers.find((user) => user.accountId === account.id)?.roleId || + undefined, + })); + + reply.send(accountsWithRole); }; export default myAccounts;