diff --git a/migrations/Migration20241206091921.ts b/migrations/Migration20241206091921.ts index 173dd5fe..c02a5dfc 100644 --- a/migrations/Migration20241206091921.ts +++ b/migrations/Migration20241206091921.ts @@ -19,7 +19,7 @@ import { Ref, ref } from '@mikro-orm/core'; import { User } from '@/users/entities/user.entity'; import { OrganizationUser } from '@/administration/entities/organization-user.entity'; -import { Project, ProjectVisiblity } from '@/administration/entities/project.entity'; +import { Project } from '@/administration/entities/project.entity'; import { Organization } from '@/administration/entities/organization.entity'; import { UserPrincipal } from '@/administration/entities/principals/user-principal.entity'; import { ProjectPrincipal } from '@/administration/entities/project-principal.entity'; @@ -49,8 +49,7 @@ export class Migration20241206091921 extends Migration { const project = new Project({ name: `${user.name}'s project`, organization: ref(Organization, user.defaultOrganization), - createdBy: ref(OrganizationUser, organizationUser._id), - visibility: ProjectVisiblity.PRIVATE + createdBy: ref(OrganizationUser, organizationUser._id) }); await this.getCollection(Project).insertOne( { @@ -60,7 +59,6 @@ export class Migration20241206091921 extends Migration { organization: project.organization.id, createdBy: project.createdBy.id, name: project.name, - visibility: project.visibility, status: project.status }, { session: this.ctx } diff --git a/migrations/Migration20250110114435.ts b/migrations/Migration20250110114435.ts new file mode 100644 index 00000000..d27f4849 --- /dev/null +++ b/migrations/Migration20250110114435.ts @@ -0,0 +1,13 @@ +import { Migration } from '@mikro-orm/migrations-mongodb'; + +import { Project } from '@/administration/entities/project.entity'; + +export class Migration20250110114435 extends Migration { + async up(): Promise { + await this.getCollection(Project).updateMany( + {}, + { $unset: { visibility: '' } }, + { session: this.ctx } + ); + } +} diff --git a/src/administration/dtos/project-create.ts b/src/administration/dtos/project-create.ts index b9680655..17a49fcf 100644 --- a/src/administration/dtos/project-create.ts +++ b/src/administration/dtos/project-create.ts @@ -16,8 +16,6 @@ import { FromSchema, JSONSchema } from 'json-schema-to-ts'; -import { ProjectVisiblity } from '../entities/project.entity.js'; - import { projectSchema } from './project.js'; export const projectCreateBodySchema = { @@ -25,12 +23,7 @@ export const projectCreateBodySchema = { additionalProperties: false, required: ['name'], properties: { - name: { type: 'string' }, - visibility: { - type: 'string', - enum: Object.values(ProjectVisiblity), - default: ProjectVisiblity.PUBLIC - } + name: { type: 'string' } } } as const satisfies JSONSchema; export type ProjectCreateBody = FromSchema; diff --git a/src/administration/dtos/project-update.ts b/src/administration/dtos/project-update.ts index 1a5dd5bc..a88025a5 100644 --- a/src/administration/dtos/project-update.ts +++ b/src/administration/dtos/project-update.ts @@ -16,8 +16,6 @@ import { FromSchema, JSONSchema } from 'json-schema-to-ts'; -import { ProjectVisiblity } from '../entities/project.entity.js'; - import { projectSchema } from './project.js'; import { projectReadParamsSchema } from './project-read.js'; @@ -28,11 +26,7 @@ export const projectUpdateBodySchema = { type: 'object', additionalProperties: false, properties: { - name: { type: 'string' }, - visibility: { - type: 'string', - enum: Object.values(ProjectVisiblity) - } + name: { type: 'string' } } } as const satisfies JSONSchema; export type ProjectUpdateBody = FromSchema; diff --git a/src/administration/dtos/project.ts b/src/administration/dtos/project.ts index 7edc7f71..5df51c78 100644 --- a/src/administration/dtos/project.ts +++ b/src/administration/dtos/project.ts @@ -16,16 +16,15 @@ import { FromSchema, JSONSchema } from 'json-schema-to-ts'; -import { ProjectStatus, ProjectVisiblity } from '../entities/project.entity'; +import { ProjectStatus } from '../entities/project.entity'; export const projectSchema = { type: 'object', - required: ['object', 'id', 'name', 'visibility', 'status', 'created_at', 'archived_at'], + required: ['object', 'id', 'name', 'status', 'created_at', 'archived_at'], properties: { object: { const: 'organization.project' }, id: { type: 'string' }, name: { type: 'string' }, - visibility: { type: 'string', enum: Object.values(ProjectVisiblity) }, status: { type: 'string', enum: Object.values(ProjectStatus) }, created_at: { type: 'number' }, archived_at: { type: 'number', nullable: true } diff --git a/src/administration/entities/project.entity.ts b/src/administration/entities/project.entity.ts index f824cb62..426fd256 100644 --- a/src/administration/entities/project.entity.ts +++ b/src/administration/entities/project.entity.ts @@ -32,12 +32,6 @@ export const ProjectStatus = { } as const; export type ProjectStatus = (typeof ProjectStatus)[keyof typeof ProjectStatus]; -export const ProjectVisiblity = { - PUBLIC: 'public', - PRIVATE: 'private' -} as const; -export type ProjectVisiblity = (typeof ProjectVisiblity)[keyof typeof ProjectVisiblity]; - @Entity() export class Project extends OrganizationAdministrationScopedEntity { getIdPrefix(): string { @@ -53,20 +47,11 @@ export class Project extends OrganizationAdministrationScopedEntity { @Property() archivedAt?: Date; - @Enum(() => ProjectVisiblity) - visibility: ProjectVisiblity; - - constructor({ - name, - status = ProjectStatus.ACTIVE, - visibility = ProjectVisiblity.PUBLIC, - ...rest - }: ProjectInput) { + constructor({ name, status = ProjectStatus.ACTIVE, ...rest }: ProjectInput) { super(rest); this.name = name; this.status = status; - this.visibility = visibility; } override delete(): void { @@ -94,4 +79,4 @@ export class Project extends OrganizationAdministrationScopedEntity { export type ProjectInput = OrganizationAdministrationScopedEntityInput & Pick & - Pick, 'status' | 'visibility'>; + Pick, 'status'>; diff --git a/src/administration/projects.service.ts b/src/administration/projects.service.ts index a2fbbcef..c53bda31 100644 --- a/src/administration/projects.service.ts +++ b/src/administration/projects.service.ts @@ -19,12 +19,12 @@ import { requestContext } from '@fastify/request-context'; import dayjs from 'dayjs'; import { ProjectCreateBody, ProjectCreateResponse } from './dtos/project-create'; -import { Project, ProjectStatus, ProjectVisiblity } from './entities/project.entity'; +import { Project, ProjectStatus } from './entities/project.entity'; import { Project as ProjectDto } from './dtos/project'; import { ProjectsListQuery, ProjectsListResponse } from './dtos/projects-list'; import { ProjectPrincipal } from './entities/project-principal.entity'; import { UserPrincipal } from './entities/principals/user-principal.entity'; -import { OrganizationUserRole, ProjectRole } from './entities/constants'; +import { ProjectRole } from './entities/constants'; import { getOrganizationUser } from './helpers'; import { ProjectReadParams, ProjectReadResponse } from './dtos/project-read'; import { @@ -46,27 +46,16 @@ export function toDto(project: Loaded): ProjectDto { object: 'organization.project', id: project.id, name: project.name, - visibility: project.visibility, status: project.status, created_at: dayjs(project.createdAt).unix(), archived_at: project.archivedAt ? dayjs(project.archivedAt).unix() : null }; } -export async function createProject({ - name, - visibility -}: ProjectCreateBody): Promise { +export async function createProject({ name }: ProjectCreateBody): Promise { const orgUser = getOrganizationUser(); - if (orgUser.role === OrganizationUserRole.MEMBER && visibility === ProjectVisiblity.PUBLIC) { - throw new APIError({ - message: 'Members can only create private projects', - code: APIErrorCode.INVALID_INPUT - }); - } - - const project = new Project({ name, visibility }); + const project = new Project({ name }); const projectPrincipal = new ProjectPrincipal({ project: ref(project), createdBy: ORM.em @@ -92,8 +81,7 @@ export async function readProject({ project_id }: ProjectReadParams): Promise { const project = await ORM.em.getRepository(Project).findOneOrFail({ id: project_id }); @@ -104,7 +92,6 @@ export async function updateProject({ }); project.name = getUpdatedValue(name, project.name); - project.visibility = getUpdatedValue(visibility, project.visibility); await ORM.em.flush(); return toDto(project); @@ -127,14 +114,7 @@ export async function listProjects({ ); // TODO missing pagination const filter: FilterQuery = { - $and: [ - { - $or: [ - { id: { $in: principals.map(({ project }) => project.id) } }, - { visibility: ProjectVisiblity.PUBLIC } - ] - } - ] + id: { $in: principals.map(({ project }) => project.id) } }; if (!include_archived) { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 7dd0013f..0f19d7cd 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -111,7 +111,7 @@ export async function createUser({ requestContext.set('organizationUser', orgUser); } - const project = new Project({ name: `${name}'s project`, visibility: 'private' }); + const project = new Project({ name: `${name}'s project` }); const projectPrincipal = new ProjectPrincipal({ project: ref(project), createdBy: ORM.em