Skip to content

Commit bb2411e

Browse files
committed
fix(api): Missing default workspace and secret test fix
1 parent f419185 commit bb2411e

File tree

8 files changed

+75
-24
lines changed

8 files changed

+75
-24
lines changed

apps/api/src/auth/guard/auth/auth.guard.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ import { AuthGuard } from './auth.guard'
22

33
describe('AuthGuard', () => {
44
it('should be defined', () => {
5-
expect(new AuthGuard(null, null, null, null)).toBeDefined()
5+
expect(new AuthGuard(null, null, null, null, null)).toBeDefined()
66
})
77
})

apps/api/src/auth/guard/auth/auth.guard.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { toSHA256 } from '@/common/cryptography'
1717
import { getUserByEmailOrId } from '@/common/user'
1818
import { Request } from 'express'
1919
import { constructErrorBody } from '@/common/util'
20+
import SlugGenerator from '@/common/slug-generator.service'
2021

2122
const X_E2E_USER_EMAIL = 'x-e2e-user-email'
2223
const X_KEYSHADE_TOKEN = 'x-keyshade-token'
@@ -29,7 +30,8 @@ export class AuthGuard implements CanActivate {
2930
private readonly jwtService: JwtService,
3031
private readonly prisma: PrismaService,
3132
private readonly reflector: Reflector,
32-
private readonly cache: CacheService
33+
private readonly cache: CacheService,
34+
private readonly slugGenerator: SlugGenerator
3335
) {}
3436

3537
/**
@@ -77,7 +79,11 @@ export class AuthGuard implements CanActivate {
7779
if (!email) {
7880
throw new ForbiddenException()
7981
}
80-
const user = await getUserByEmailOrId(email, this.prisma)
82+
const user = await getUserByEmailOrId(
83+
email,
84+
this.prisma,
85+
this.slugGenerator
86+
)
8187

8288
userContext = {
8389
...user,
@@ -134,7 +140,11 @@ export class AuthGuard implements CanActivate {
134140
ipAddress: request.ip
135141
}
136142
} else {
137-
const user = await getUserByEmailOrId(payload['id'], this.prisma)
143+
const user = await getUserByEmailOrId(
144+
payload['id'],
145+
this.prisma,
146+
this.slugGenerator
147+
)
138148

139149
userContext = {
140150
...user,

apps/api/src/auth/service/auth.service.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,11 @@ export class AuthService {
7676
)
7777
}
7878

79-
const user = await getUserByEmailOrId(email, this.prisma)
79+
const user = await getUserByEmailOrId(
80+
email,
81+
this.prisma,
82+
this.slugGenerator
83+
)
8084
const otp = await generateOtp(email, user.id, this.prisma)
8185
await this.mailService.sendOtp(email, otp.code)
8286
}
@@ -96,7 +100,11 @@ export class AuthService {
96100
): Promise<UserAuthenticatedResponse> {
97101
this.logger.log(`Validating login code for ${email}`)
98102

99-
const user = await getUserByEmailOrId(email, this.prisma)
103+
const user = await getUserByEmailOrId(
104+
email,
105+
this.prisma,
106+
this.slugGenerator
107+
)
100108

101109
this.logger.log(`Checking if OTP is valid for ${email}`)
102110
const isOtpValid =
@@ -231,7 +239,7 @@ export class AuthService {
231239

232240
this.logger.log(`Checking if user exists with email: ${email}`)
233241
try {
234-
user = await getUserByEmailOrId(email, this.prisma)
242+
user = await getUserByEmailOrId(email, this.prisma, this.slugGenerator)
235243
} catch (ignored) {}
236244

237245
// We need to create the user if it doesn't exist yet

apps/api/src/common/user.ts

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ export async function createUser(
8686
*/
8787
export async function getUserByEmailOrId(
8888
input: User['email'] | User['id'],
89-
prisma: PrismaService
89+
prisma: PrismaService,
90+
slugGenerator: SlugGenerator
9091
): Promise<UserWithWorkspace> {
9192
const logger = new Logger('getUserByEmailOrId')
9293

@@ -135,20 +136,29 @@ export async function getUserByEmailOrId(
135136
logger.log(
136137
`User ${user.id} is a regular user. Getting default workspace for user ${user.id}`
137138
)
138-
const defaultWorkspace = await prisma.workspace.findFirst({
139+
let defaultWorkspace = await prisma.workspace.findFirst({
139140
where: {
140141
ownerId: user.id,
141142
isDefault: true
142143
}
143144
})
144145

145146
if (!defaultWorkspace) {
146-
logger.error(`Default workspace not found for user ${user.id}`)
147-
throw new NotFoundException(
148-
constructErrorBody(
149-
'Default workspace not found',
150-
'We could not find your default workspace. Please get in touch with us.'
151-
)
147+
logger.warn(`Default workspace not found for user ${user.id}`)
148+
149+
// Create the user's default workspace
150+
logger.log(
151+
`User ${user.id} has no default workspace. Creating default workspace.`
152+
)
153+
defaultWorkspace = await createWorkspace(
154+
user,
155+
{ name: 'My Workspace' },
156+
prisma,
157+
slugGenerator,
158+
true
159+
)
160+
logger.log(
161+
`Created user ${user.id} with default workspace ${defaultWorkspace.id}`
152162
)
153163
}
154164

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import { PartialType } from '@nestjs/swagger'
22
import { CreateSecret } from '../create.secret/create.secret'
3-
import { IsBoolean, IsOptional } from 'class-validator'
3+
import { IsBoolean, IsOptional, IsString } from 'class-validator'
44
export class UpdateSecret extends PartialType(CreateSecret) {
55
@IsBoolean()
66
@IsOptional()
77
decryptValue?: boolean
88

9-
@IsBoolean()
9+
@IsString()
1010
@IsOptional()
1111
privateKey?: string
1212
}

apps/api/src/secret/secret.e2e.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ describe('Secret Controller Tests', () => {
513513

514514
expect(response.statusCode).toBe(200)
515515
expect(response.json().updatedVersions.length).toBe(1)
516-
expect(response.json().updatedVersions[0].value).toBe(
516+
expect(response.json().updatedVersions[0].value).not.toBe(
517517
'Updated Secret 1 value'
518518
)
519519

apps/api/src/secret/secret.service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,10 @@ export class SecretService {
362362
dto.privateKey)
363363
) {
364364
for (const version of updatedVersions) {
365-
version.value = await decrypt(secret.project.privateKey, version.value)
365+
version.value = await decrypt(
366+
secret.project.privateKey ?? dto.privateKey,
367+
version.value
368+
)
366369
}
367370
}
368371

apps/api/src/workspace-membership/workspace-membership.service.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ export class WorkspaceMembershipService {
6666
authorities: [Authority.WORKSPACE_ADMIN]
6767
})
6868

69-
const otherUser = await getUserByEmailOrId(otherUserEmail, this.prisma)
69+
const otherUser = await getUserByEmailOrId(
70+
otherUserEmail,
71+
this.prisma,
72+
this.slugGenerator
73+
)
7074

7175
if (otherUser.id === user.id) {
7276
throw new BadRequestException(
@@ -360,7 +364,11 @@ export class WorkspaceMembershipService {
360364
otherUserEmail: User['email'],
361365
roleSlugs: WorkspaceRole['slug'][]
362366
): Promise<void> {
363-
const otherUser = await getUserByEmailOrId(otherUserEmail, this.prisma)
367+
const otherUser = await getUserByEmailOrId(
368+
otherUserEmail,
369+
this.prisma,
370+
this.slugGenerator
371+
)
364372

365373
const workspace =
366374
await this.authorizationService.authorizeUserAccessToWorkspace({
@@ -656,7 +664,11 @@ export class WorkspaceMembershipService {
656664
workspaceSlug: Workspace['slug'],
657665
inviteeEmail: User['email']
658666
): Promise<void> {
659-
const inviteeUser = await getUserByEmailOrId(inviteeEmail, this.prisma)
667+
const inviteeUser = await getUserByEmailOrId(
668+
inviteeEmail,
669+
this.prisma,
670+
this.slugGenerator
671+
)
660672

661673
const workspace =
662674
await this.authorizationService.authorizeUserAccessToWorkspace({
@@ -811,7 +823,11 @@ export class WorkspaceMembershipService {
811823
let otherUser: User | null = null
812824

813825
try {
814-
otherUser = await getUserByEmailOrId(otherUserEmail, this.prisma)
826+
otherUser = await getUserByEmailOrId(
827+
otherUserEmail,
828+
this.prisma,
829+
this.slugGenerator
830+
)
815831
} catch (e) {
816832
return false
817833
}
@@ -836,7 +852,11 @@ export class WorkspaceMembershipService {
836852
)
837853

838854
// Fetch the invitee user
839-
const member = await getUserByEmailOrId(inviteeEmail, this.prisma)
855+
const member = await getUserByEmailOrId(
856+
inviteeEmail,
857+
this.prisma,
858+
this.slugGenerator
859+
)
840860

841861
const workspace =
842862
await this.authorizationService.authorizeUserAccessToWorkspace({

0 commit comments

Comments
 (0)