Files
nowdatabase/backend/src/services/write/project.ts
T
juhanikatandGitHub 5c065508b4 update project update process in frontend and backend, and add project validators (#1230)
* update project update prosess in frontend, and add project validators

* change project update process in backend

* update project backend files, projectReducer, project validators and tests

* update project api tests, and error handling in ProjectDetails

* update frontend project creation form

* remove ProjectEditPage tests and fix ProjectNewPage tests

* update project api tests, project write process, and project validators

* remove unneeded files relating to projects, and merge project/ and projects/ route files

* remove project validators from backend, and update other project files

* allow all users to view projects table

* fix import issue

* update project api tests to use correct url, and add --runInBand flag to backend unit tests

* update cypress test
2026-08-19 11:21:36 +03:00

80 lines
2.7 KiB
TypeScript

import { EditDataType, ProjectDetailsType } from '../../../../frontend/src/shared/types'
import Prisma from '../../../prisma/generated/now_test_client'
import { getFieldsOfTables, nowDb } from '../../utils/db'
import { getProjectDetails } from '../project'
import { filterAllowedKeys, fixRadioSelection } from './writeOperations/utils'
const loadMembersByIds = async (memberIds: number[]) => {
if (!memberIds.length) return [] as Array<{ initials: string; user_id: number }>
const members = await nowDb.com_people.findMany({
select: { initials: true, user_id: true },
where: { user_id: { in: memberIds } },
})
if (members.length !== memberIds.length) {
throw new Error('One or more project members do not exist')
}
return members
}
export const writeProject = async (project: EditDataType<ProjectDetailsType>) => {
const allowedColumns = getFieldsOfTables(['now_proj'])
const filteredProject = filterAllowedKeys(project, allowedColumns) as Prisma.now_proj
let projectId: number
const contactPerson = await nowDb.com_people.findFirst({ where: { initials: project.contact } })
if (!contactPerson) {
throw new Error('Contact does not exist')
}
const memberUserIds = project.now_proj_people
.filter(member => member.rowState !== 'removed')
.map(member => member.com_people!.user_id!)
const members = await loadMembersByIds(memberUserIds)
const existingProject = filteredProject.pid ? await getProjectDetails(filteredProject.pid) : null
if (!existingProject) {
const newProject = await nowDb.now_proj.create({
data: {
...filteredProject,
proj_records: fixRadioSelection(filteredProject.proj_records),
now_proj_people:
members.length > 0
? {
create: members.map(member => ({ initials: member.initials })),
}
: undefined,
},
include: { now_proj_people: true },
})
projectId = newProject.pid
} else {
await nowDb.$transaction(async prisma => {
await prisma.now_proj.update({
where: { pid: filteredProject.pid },
data: {
...filteredProject,
proj_records: fixRadioSelection(filteredProject.proj_records),
},
})
if (existingProject) {
// removes all members, then adds back ones that are not marked as removed
if (Array.isArray(members)) {
await prisma.now_proj_people.deleteMany({ where: { pid: filteredProject.pid } })
if (members.length > 0) {
await prisma.now_proj_people.createMany({
data: members.map(member => ({ pid: filteredProject.pid, initials: member.initials })),
})
}
}
}
})
projectId = filteredProject.pid
}
return projectId
}