Skip to content

Commit

Permalink
feat-spaces
Browse files Browse the repository at this point in the history
  • Loading branch information
McPizza0 committed Jul 29, 2024
1 parent ab0145c commit 5d2e4d5
Show file tree
Hide file tree
Showing 27 changed files with 4,029 additions and 61 deletions.
1 change: 1 addition & 0 deletions .vscode/cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
"Ratelimiter",
"RPID",
"shadcn",
"Shorcode",
"Shortcode",
"simplewebauthn",
"starttls",
Expand Down
4 changes: 3 additions & 1 deletion apps/platform/trpc/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { addressRouter } from './routers/userRouter/addressRouter';
import { storeRouter } from './routers/orgRouter/orgStoreRouter';
import { signupRouter } from './routers/authRouter/signupRouter';
import { convoRouter } from './routers/convoRouter/convoRouter';
import { spaceRouter } from './routers/spaceRouter/spaceRouter';
import { crudRouter } from './routers/orgRouter/orgCrudRouter';
import { router } from './trpc';

Expand Down Expand Up @@ -64,7 +65,8 @@ export const trpcPlatformRouter = router({
auth: trpcPlatformAuthRouter,
account: trpcPlatformAccountRouter,
org: trpcPlatformOrgRouter,
convos: convoRouter
convos: convoRouter,
spaces: spaceRouter
});

export type TrpcPlatformRouter = typeof trpcPlatformRouter;
31 changes: 31 additions & 0 deletions apps/platform/trpc/routers/orgRouter/iCanHaz/iCanHazRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,37 @@ export const iCanHazRouter = router({
return true;
}
return await billingTrpcClient.iCanHaz.team.query({ orgId: org.id });
}),
space: orgProcedure.query(async ({ ctx }) => {
const { org, selfHosted } = ctx;
if (selfHosted) {
return {
open: true,
private: true
};
}
return await billingTrpcClient.iCanHaz.space.query({ orgId: org.id });
}),
spaceStatus: orgProcedure.query(async ({ ctx }) => {
const { org, selfHosted } = ctx;
if (selfHosted) {
return {
open: 8,
active: 8,
closed: 8
};
}
return await billingTrpcClient.iCanHaz.spaceStatus.query({ orgId: org.id });
}),
spaceTag: orgProcedure.query(async ({ ctx }) => {
const { org, selfHosted } = ctx;
if (selfHosted) {
return {
open: true,
private: true
};
}
return await billingTrpcClient.iCanHaz.spaceTag.query({ orgId: org.id });
})
});

Expand Down
64 changes: 55 additions & 9 deletions apps/platform/trpc/routers/orgRouter/orgCrudRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,13 @@ import {
orgs,
orgMembers,
orgMemberProfiles,
accounts
accounts,
spaces,
spaceMembers
} from '@u22n/database/schema';
import { blockedUsernames, reservedUsernames } from '~platform/utils/signup';
import { router, accountProcedure } from '~platform/trpc/trpc';
import { validateSpaceShortCode } from '../spaceRouter/utils';
import { typeIdGenerator } from '@u22n/utils/typeid';
import { eq, and, like } from '@u22n/database/orm';
import type { DBType } from '@u22n/database';
Expand Down Expand Up @@ -137,17 +140,15 @@ export const crudRouter = router({
});
}

const newPublicId = typeIdGenerator('org');
const newOrgPublicId = typeIdGenerator('org');

const insertOrgResponse = await db.insert(orgs).values({
ownerId: accountId,
name: input.orgName,
shortcode: input.orgShortcode,
publicId: newPublicId
publicId: newOrgPublicId
});
const orgId = +insertOrgResponse.insertId;

const newProfilePublicId = typeIdGenerator('orgMemberProfile');
const orgId = Number(insertOrgResponse.insertId);

const { username } =
(await db.query.accounts.findFirst({
Expand All @@ -168,7 +169,7 @@ export const crudRouter = router({
.insert(orgMemberProfiles)
.values({
orgId: orgId,
publicId: newProfilePublicId,
publicId: typeIdGenerator('orgMemberProfile'),
accountId: accountId,
firstName: username,
lastName: '',
Expand All @@ -178,7 +179,7 @@ export const crudRouter = router({
});

const newOrgMemberPublicId = typeIdGenerator('orgMembers');
await db.insert(orgMembers).values({
const orgMemberResponse = await db.insert(orgMembers).values({
orgId: orgId,
publicId: newOrgMemberPublicId,
role: 'admin',
Expand All @@ -187,8 +188,53 @@ export const crudRouter = router({
orgMemberProfileId: Number(newOrgMemberProfileInsert.insertId)
});

const spaceShortcode = await validateSpaceShortCode({
db: db,
shortcode: `${username}`,
orgId: orgId
});
const newSpaceResponse = await db.insert(spaces).values({
orgId: orgId,
publicId: typeIdGenerator('spaces'),
name: `${username}'s Personal Space`,
type: 'private',
personalSpace: true,
color: 'cyan',
icon: 'house',
createdByOrgMemberId: Number(orgMemberResponse.insertId),
shortcode: spaceShortcode.shortcode
});

await db.insert(spaceMembers).values({
orgId: orgId,
spaceId: Number(newSpaceResponse.insertId),
publicId: typeIdGenerator('spaceMembers'),
orgMemberId: Number(orgMemberResponse.insertId),
addedByOrgMemberId: Number(orgMemberResponse.insertId),
role: 'admin',
canCreate: true,
canRead: true,
canComment: true,
canReply: true,
canDelete: true,
canChangeStatus: true,
canSetStatusToClosed: true,
canAddTags: true,
canMoveToAnotherSpace: true,
canAddToAnotherSpace: true,
canMergeConvos: true,
canAddParticipants: true
});

await db
.update(orgMembers)
.set({
personalSpaceId: Number(newSpaceResponse.insertId)
})
.where(eq(orgMembers.id, Number(orgMemberResponse.insertId)));

return {
orgId: newPublicId,
orgId: newOrgPublicId,
orgName: input.orgName
};
}),
Expand Down
51 changes: 50 additions & 1 deletion apps/platform/trpc/routers/orgRouter/users/invitesRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import {
orgInvitations,
orgMembers,
orgMemberProfiles,
accounts
accounts,
spaces,
spaceMembers
} from '@u22n/database/schema';
import {
router,
Expand All @@ -20,6 +22,7 @@ import { refreshOrgShortcodeCache } from '~platform/utils/orgShortcode';
import { billingTrpcClient } from '~platform/utils/tRPCServerClients';
import { typeIdGenerator, typeIdValidator } from '@u22n/utils/typeid';
import { sendInviteEmail } from '~platform/utils/mail/transactional';
import { validateSpaceShortCode } from '../../spaceRouter/utils';
import { nanoIdToken, zodSchemas } from '@u22n/utils/zodSchemas';
import { addOrgMemberToTeamHandler } from './teamsHandler';
import { ratelimiter } from '~platform/trpc/ratelimit';
Expand Down Expand Up @@ -91,6 +94,52 @@ export const invitesRouter = router({
orgMemberProfileId: orgMemberProfileId
});

const spaceShortcode = await validateSpaceShortCode({
db: db,
shortcode: `${newOrgMember.firstName}${newOrgMember.lastName ? '-' + newOrgMember.lastName : ''}`,
orgId: orgId
});

const newSpaceResponse = await db.insert(spaces).values({
orgId: orgId,
publicId: typeIdGenerator('spaces'),
name: 'Personal',
type: 'private',
personalSpace: true,
color: 'cyan',
icon: 'house',
createdByOrgMemberId: Number(orgMemberResponse.insertId),
shortcode: spaceShortcode.shortcode
});

await db.insert(spaceMembers).values({
orgId: orgId,
spaceId: Number(newSpaceResponse.insertId),
publicId: typeIdGenerator('spaceMembers'),
orgMemberId: Number(orgMemberResponse.insertId),
addedByOrgMemberId: Number(orgMemberResponse.insertId),
role: 'admin',
canCreate: true,
canRead: true,
canComment: true,
canReply: true,
canDelete: true,
canChangeStatus: true,
canSetStatusToClosed: true,
canAddTags: true,
canMoveToAnotherSpace: true,
canAddToAnotherSpace: true,
canMergeConvos: true,
canAddParticipants: true
});

await db
.update(orgMembers)
.set({
personalSpaceId: Number(newSpaceResponse.insertId)
})
.where(eq(orgMembers.id, Number(orgMemberResponse.insertId)));

// Insert teamMemberships - save ID
if (teamsInput) {
for (const teamPublicId of teamsInput.teamsPublicIds) {
Expand Down
17 changes: 17 additions & 0 deletions apps/platform/trpc/routers/spaceRouter/membersRouter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import {
orgs,

Check warning on line 2 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'orgs' is defined but never used
orgMembers,

Check warning on line 3 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'orgMembers' is defined but never used
orgMemberProfiles,

Check warning on line 4 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'orgMemberProfiles' is defined but never used
accounts,

Check warning on line 5 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'accounts' is defined but never used
spaces,

Check warning on line 6 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'spaces' is defined but never used
spaceMembers

Check warning on line 7 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'spaceMembers' is defined but never used
} from '@u22n/database/schema';
import { blockedUsernames, reservedUsernames } from '~platform/utils/signup';

Check warning on line 9 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'blockedUsernames' is defined but never used

Check warning on line 9 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'reservedUsernames' is defined but never used
import { router, accountProcedure } from '~platform/trpc/trpc';

Check warning on line 10 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'accountProcedure' is defined but never used
import { typeIdGenerator } from '@u22n/utils/typeid';

Check warning on line 11 in apps/platform/trpc/routers/spaceRouter/membersRouter.ts

View workflow job for this annotation

GitHub Actions / Check and Build

'typeIdGenerator' is defined but never used
import { eq, and } from '@u22n/database/orm';
import type { DBType } from '@u22n/database';
import { TRPCError } from '@trpc/server';
import { z } from 'zod';

export const spaceMembersRouter = router({});
Loading

0 comments on commit 5d2e4d5

Please sign in to comment.