chore(root): rename organizationSlug to organizationId (#91)

This commit is contained in:
Carl-Gerhard Lindesvärd
2024-11-20 14:04:55 +01:00
committed by GitHub
parent 0221948aab
commit cd16ac878d
52 changed files with 176 additions and 360 deletions

View File

@@ -74,13 +74,12 @@ model Member {
}
model Project {
id String @id @default(dbgenerated("gen_random_uuid()"))
name String
organizationSlug String
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
eventsCount Int @default(0)
types ProjectType[] @default([])
id String @id @default(dbgenerated("gen_random_uuid()"))
name String
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
eventsCount Int @default(0)
types ProjectType[] @default([])
events Event[]
profiles Profile[]
@@ -108,17 +107,16 @@ enum AccessLevel {
}
model ProjectAccess {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
projectId String
project Project @relation(fields: [projectId], references: [id])
organizationSlug String
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
userId String
user User @relation(fields: [userId], references: [id])
level AccessLevel
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
projectId String
project Project @relation(fields: [projectId], references: [id])
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
userId String
user User @relation(fields: [userId], references: [id])
level AccessLevel
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("project_access")
}
@@ -169,17 +167,16 @@ enum ClientType {
}
model Client {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
name String
secret String?
type ClientType @default(write)
projectId String?
project Project? @relation(fields: [projectId], references: [id])
organizationSlug String
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
cors String?
crossDomain Boolean @default(false)
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
name String
secret String?
type ClientType @default(write)
projectId String?
project Project? @relation(fields: [projectId], references: [id])
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
cors String?
crossDomain Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@ -208,14 +205,13 @@ enum ChartType {
}
model Dashboard {
id String @id @default(dbgenerated("gen_random_uuid()"))
name String
organizationSlug String
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
projectId String
project Project @relation(fields: [projectId], references: [id])
reports Report[]
id String @id @default(dbgenerated("gen_random_uuid()"))
name String
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
projectId String
project Project @relation(fields: [projectId], references: [id])
reports Report[]
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@ -269,16 +265,15 @@ model Waitlist {
}
model ShareOverview {
id String @unique
projectId String @unique
project Project @relation(fields: [projectId], references: [id])
organizationSlug String
organization Organization? @relation(fields: [organizationId], references: [id])
organizationId String?
public Boolean @default(false)
password String?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
id String @unique
projectId String @unique
project Project @relation(fields: [projectId], references: [id])
organization Organization @relation(fields: [organizationId], references: [id])
organizationId String
public Boolean @default(false)
password String?
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
@@map("shares")
}

View File

@@ -8,10 +8,10 @@ export type IServiceClientWithProject = Prisma.ClientGetPayload<{
};
}>;
export async function getClientsByOrganizationSlug(organizationSlug: string) {
export async function getClientsByOrganizationId(organizationId: string) {
return db.client.findMany({
where: {
organizationSlug,
organizationId,
},
include: {
project: true,

View File

@@ -66,10 +66,10 @@ export async function getOrganizationByProjectId(projectId: string) {
return transformOrganization(project.organization);
}
export async function getInvites(organizationSlug: string) {
export async function getInvites(organizationId: string) {
return db.member.findMany({
where: {
organizationId: organizationSlug,
organizationId,
userId: null,
},
include: {
@@ -78,11 +78,11 @@ export async function getInvites(organizationSlug: string) {
});
}
export async function getMembers(organizationSlug: string) {
export async function getMembers(organizationId: string) {
const [members, access] = await Promise.all([
db.member.findMany({
where: {
organizationId: organizationSlug,
organizationId,
userId: {
not: null,
},
@@ -93,7 +93,7 @@ export async function getMembers(organizationSlug: string) {
}),
db.projectAccess.findMany({
where: {
organizationSlug,
organizationId,
},
}),
]);
@@ -104,10 +104,10 @@ export async function getMembers(organizationSlug: string) {
}));
}
export async function getMember(organizationSlug: string, userId: string) {
export async function getMember(organizationId: string, userId: string) {
return db.member.findFirst({
where: {
organizationId: organizationSlug,
organizationId,
userId,
},
});

View File

@@ -44,10 +44,10 @@ export async function getProjectWithClients(id: string) {
return res;
}
export async function getProjectsByOrganizationSlug(organizationSlug: string) {
export async function getProjectsByOrganizationId(organizationId: string) {
return db.project.findMany({
where: {
organizationSlug,
organizationId,
},
orderBy: {
createdAt: 'desc',
@@ -55,7 +55,7 @@ export async function getProjectsByOrganizationSlug(organizationSlug: string) {
});
}
export async function getCurrentProjects(organizationSlug: string) {
export async function getCurrentProjects(organizationId: string) {
const session = auth();
if (!session.userId) {
return [];
@@ -64,7 +64,7 @@ export async function getCurrentProjects(organizationSlug: string) {
const [projects, members, access] = await Promise.all([
db.project.findMany({
where: {
organizationSlug,
organizationId,
},
orderBy: {
eventsCount: 'desc',
@@ -73,13 +73,13 @@ export async function getCurrentProjects(organizationSlug: string) {
db.member.findMany({
where: {
userId: session.userId,
organizationId: organizationSlug,
organizationId,
},
}),
db.projectAccess.findMany({
where: {
userId: session.userId,
organizationId: organizationSlug,
organizationId,
},
}),
]);

View File

@@ -12,7 +12,7 @@ export async function getProjectAccess({
try {
// Check if user has access to the project
const project = await getProjectById(projectId);
if (!project?.organizationSlug) {
if (!project?.organizationId) {
return false;
}
@@ -20,12 +20,12 @@ export async function getProjectAccess({
db.projectAccess.findMany({
where: {
userId,
organizationId: project.organizationSlug,
organizationId: project.organizationId,
},
}),
db.member.findFirst({
where: {
organizationId: project.organizationSlug,
organizationId: project.organizationId,
userId,
},
}),

View File

@@ -46,7 +46,7 @@ export const clientRouter = createTRPCRouter({
z.object({
name: z.string(),
projectId: z.string(),
organizationSlug: z.string(),
organizationId: z.string(),
cors: z.string().nullable(),
crossDomain: z.boolean().optional(),
type: z.enum(['read', 'write', 'root']).optional(),
@@ -55,8 +55,7 @@ export const clientRouter = createTRPCRouter({
.mutation(async ({ input }) => {
const secret = `sec_${crypto.randomBytes(10).toString('hex')}`;
const data: Prisma.ClientCreateArgs['data'] = {
organizationSlug: input.organizationSlug,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
projectId: input.projectId,
name: input.name,
type: input.type ?? 'write',

View File

@@ -50,7 +50,6 @@ export const dashboardRouter = createTRPCRouter({
data: {
id: await getId('dashboard', input.name),
projectId: input.projectId,
organizationSlug: project.organizationId!,
organizationId: project.organizationId,
name: input.name,
},

View File

@@ -13,8 +13,8 @@ async function createOrGetOrganization(
input: z.infer<typeof zOnboardingProject>,
userId: string,
) {
if (input.organizationSlug) {
return await getOrganizationBySlug(input.organizationSlug);
if (input.organizationId) {
return await getOrganizationBySlug(input.organizationId);
}
if (input.organization) {
@@ -92,7 +92,6 @@ export const onboardingRouter = createTRPCRouter({
data: {
id: await getId('project', input.project),
name: input.project,
organizationSlug: organization.id,
organizationId: organization.id,
types,
},
@@ -102,7 +101,6 @@ export const onboardingRouter = createTRPCRouter({
const client = await db.client.create({
data: {
name: `${project.name} Client`,
organizationSlug: organization.id,
organizationId: organization.id,
projectId: project.id,
type: 'write',

View File

@@ -42,7 +42,7 @@ export const organizationRouter = createTRPCRouter({
.mutation(async ({ input, ctx }) => {
const access = await getOrganizationAccess({
userId: ctx.session.userId,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
});
if (access?.role !== 'org:admin') {
@@ -72,7 +72,7 @@ export const organizationRouter = createTRPCRouter({
return db.member.create({
data: {
email,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
role: input.role,
invitedById: ctx.session.userId,
meta: {
@@ -175,7 +175,7 @@ export const organizationRouter = createTRPCRouter({
.input(
z.object({
userId: z.string(),
organizationSlug: z.string(),
organizationId: z.string(),
access: z.array(z.string()),
}),
)
@@ -186,7 +186,7 @@ export const organizationRouter = createTRPCRouter({
const access = await getOrganizationAccess({
userId: ctx.session.userId,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
});
if (access?.role !== 'org:admin') {
@@ -197,14 +197,13 @@ export const organizationRouter = createTRPCRouter({
db.projectAccess.deleteMany({
where: {
userId: input.userId,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
},
}),
db.projectAccess.createMany({
data: input.access.map((projectId) => ({
userId: input.userId,
organizationSlug: input.organizationSlug,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
projectId: projectId,
level: 'read',
})),

View File

@@ -4,7 +4,7 @@ import {
db,
getId,
getProjectByIdCached,
getProjectsByOrganizationSlug,
getProjectsByOrganizationId,
} from '@openpanel/db';
import { getProjectAccess } from '../access';
@@ -15,12 +15,12 @@ export const projectRouter = createTRPCRouter({
list: protectedProcedure
.input(
z.object({
organizationSlug: z.string().nullable(),
organizationId: z.string().nullable(),
}),
)
.query(async ({ input: { organizationSlug } }) => {
if (organizationSlug === null) return [];
return getProjectsByOrganizationSlug(organizationSlug);
.query(async ({ input: { organizationId } }) => {
if (organizationId === null) return [];
return getProjectsByOrganizationId(organizationId);
}),
update: protectedProcedure
@@ -54,15 +54,14 @@ export const projectRouter = createTRPCRouter({
.input(
z.object({
name: z.string().min(1),
organizationSlug: z.string(),
organizationId: z.string(),
}),
)
.mutation(async ({ input: { name, organizationSlug } }) => {
.mutation(async ({ input: { name, organizationId } }) => {
return db.project.create({
data: {
id: await getId('project', name),
organizationSlug: organizationSlug,
organizationId: organizationSlug,
organizationId,
name: name,
},
});

View File

@@ -17,8 +17,7 @@ export const shareRouter = createTRPCRouter({
},
create: {
id: uid.rnd(),
organizationSlug: input.organizationSlug,
organizationId: input.organizationSlug,
organizationId: input.organizationId,
projectId: input.projectId,
public: input.public,
password: input.password || null,

View File

@@ -88,17 +88,6 @@ const enforceAccess = t.middleware(async ({ ctx, next, rawInput }) => {
}
}
if (has('organizationSlug', rawInput)) {
const access = await getOrganizationAccessCached({
userId: ctx.session.userId!,
organizationId: rawInput.organizationSlug as string,
});
if (!access) {
throw TRPCAccessError('You do not have access to this organization');
}
}
return next();
});

View File

@@ -88,13 +88,13 @@ export const zReportInput = zChartInput.extend({
export const zInviteUser = z.object({
email: z.string().email(),
organizationSlug: z.string(),
organizationId: z.string(),
role: z.enum(['org:admin', 'org:member']),
access: z.array(z.string()),
});
export const zShareOverview = z.object({
organizationSlug: z.string(),
organizationId: z.string(),
projectId: z.string(),
password: z.string().nullable(),
public: z.boolean(),
@@ -110,7 +110,7 @@ export const zCreateReference = z.object({
export const zOnboardingProject = z
.object({
organization: z.string().optional(),
organizationSlug: z.string().optional(),
organizationId: z.string().optional(),
project: z.string().min(3),
domain: z.string().url().or(z.literal('').or(z.null())),
website: z.boolean(),
@@ -118,7 +118,7 @@ export const zOnboardingProject = z
backend: z.boolean(),
})
.superRefine((data, ctx) => {
if (!data.organization && !data.organizationSlug) {
if (!data.organization && !data.organizationId) {
ctx.addIssue({
code: 'custom',
message: 'Organization is required',
@@ -127,7 +127,7 @@ export const zOnboardingProject = z
ctx.addIssue({
code: 'custom',
message: 'Organization is required',
path: ['organizationSlug'],
path: ['organizationId'],
});
}