mirror of
https://github.com/nowcommunity/nowdatabase.git
synced 2026-10-12 19:13:52 +03:00
Make it possible to use validators code from frontend
This commit is contained in:
+9
-6
@@ -4,9 +4,10 @@ ENV TZ="Europe/Helsinki"
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
|
||||
RUN mkdir -p /usr/src/app/frontend/src/
|
||||
RUN mkdir -p /usr/src/app/frontend/src/validators
|
||||
|
||||
COPY frontend/src/backendTypes.d.ts /usr/src/app/frontend/src/
|
||||
COPY frontend/src/validators /usr/src/app/frontend/src/validators
|
||||
COPY backend/package.json backend/
|
||||
COPY backend/package-lock.json backend/
|
||||
COPY backend/prisma backend
|
||||
@@ -18,18 +19,20 @@ WORKDIR /usr/src/app/backend
|
||||
RUN npm ci
|
||||
|
||||
COPY backend .
|
||||
|
||||
RUN rm -rf build
|
||||
RUN npm run build
|
||||
|
||||
# alpine3.16 because newer versions have changed a dependency, causing Prisma to fail
|
||||
FROM node:20-alpine3.16 AS node-run
|
||||
|
||||
WORKDIR /usr/src/app
|
||||
RUN mkdir -p /usr/src/app/backend
|
||||
WORKDIR /usr/src/app/backend
|
||||
|
||||
COPY --from=backend-build /usr/src/app/backend/build /usr/src/app/build
|
||||
COPY --from=backend-build /usr/src/app/backend/node_modules /usr/src/app/node_modules
|
||||
COPY --from=backend-build /usr/src/app/backend/build .
|
||||
COPY --from=backend-build /usr/src/app/backend/node_modules ./node_modules
|
||||
|
||||
EXPOSE 4000
|
||||
ENV NODE_ENV=production
|
||||
RUN pwd
|
||||
CMD ["node", "backend/src/index.js"]
|
||||
|
||||
CMD ["node", "build/index.js"]
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
import { Request, Router } from 'express'
|
||||
import { editLocality, fixEditedLocality, getAllLocalities, getLocalityDetails } from '../services/locality'
|
||||
import {
|
||||
editLocality,
|
||||
filterLocality,
|
||||
fixEditedLocality,
|
||||
getAllLocalities,
|
||||
getLocalityDetails,
|
||||
validateEntireLocality,
|
||||
} from '../services/locality'
|
||||
import { fixBigInt } from '../utils/common'
|
||||
import { detailedDiff } from 'deep-object-diff'
|
||||
import { LocalityDetails } from '../../../frontend/src/backendTypes'
|
||||
@@ -23,6 +30,11 @@ router.put('/', async (req: Request<object, object, { locality: LocalityDetails
|
||||
const fixedEditedLocality = fixEditedLocality(editedLocality)
|
||||
const oldLocality = await getLocalityDetails(fixedEditedLocality.lid)
|
||||
const difference = detailedDiff(oldLocality!, fixedEditedLocality)
|
||||
const filteredLoc = filterLocality(difference.updated)
|
||||
const validationErrors = validateEntireLocality(filteredLoc)
|
||||
if (validationErrors.length > 0) {
|
||||
return res.status(400).send({ validationErrors })
|
||||
}
|
||||
const result = await editLocality(oldLocality!.lid, difference.updated)
|
||||
if (!result) return res.status(400).send()
|
||||
return res.status(200).send(result)
|
||||
|
||||
@@ -2,6 +2,7 @@ import { logger } from '../utils/logger'
|
||||
import { prisma } from '../utils/db'
|
||||
import { LocalityDetails } from '../../../frontend/src/backendTypes'
|
||||
import Prisma from '@prisma/client'
|
||||
import { validateLocality } from '../../../frontend/src/validators/locality'
|
||||
|
||||
export const testDb = async () => {
|
||||
const result = await prisma.now_loc.findMany({ select: { loc_name: true }, where: { loc_name: 'Amba East' } })
|
||||
@@ -78,7 +79,17 @@ export const fixEditedLocality = (editedLocality: LocalityDetails) => {
|
||||
return editedLocality
|
||||
}
|
||||
|
||||
export const editLocality = async (lid: number, editedFields: Partial<LocalityDetails>) => {
|
||||
export const validateEntireLocality = (editedFields: Partial<Prisma.now_loc>) => {
|
||||
const keys = Object.keys(editedFields)
|
||||
const errors = []
|
||||
for (const key of keys) {
|
||||
const error = validateLocality(editedFields as LocalityDetails, key as keyof LocalityDetails)
|
||||
if (error !== null) errors.push(error)
|
||||
}
|
||||
return errors
|
||||
}
|
||||
|
||||
export const filterLocality = (editedFields: Partial<LocalityDetails>) => {
|
||||
const fields = Object.keys(prisma.now_loc.fields)
|
||||
const filteredLoc = Object.entries(editedFields)
|
||||
.filter(([field]) => fields.includes(field))
|
||||
@@ -86,6 +97,10 @@ export const editLocality = async (lid: number, editedFields: Partial<LocalityDe
|
||||
obj[cur[0]] = cur[1]
|
||||
return obj
|
||||
}, {}) as Partial<Prisma.now_loc>
|
||||
return filteredLoc
|
||||
}
|
||||
|
||||
export const editLocality = async (lid: number, filteredLoc: Partial<Prisma.now_loc>) => {
|
||||
const result = await prisma.now_loc.update({
|
||||
where: {
|
||||
lid,
|
||||
|
||||
@@ -13,11 +13,12 @@ services:
|
||||
container_name: nowdb-backend-dev
|
||||
image: node:20-alpine3.16
|
||||
volumes:
|
||||
- ./backend/:/usr/src/app
|
||||
- ./backend/:/usr/src/app/backend/
|
||||
- ./frontend/src/validators:/usr/src/app/frontend/src/validators
|
||||
ports:
|
||||
- 127.0.0.1:4000:4000
|
||||
command: >
|
||||
sh -c "cd /usr/src/app && npm ci && npm run dev"
|
||||
sh -c "cd /usr/src/app/backend && npm ci && npm run dev"
|
||||
env_file: .dev.env
|
||||
db:
|
||||
container_name: nowdb-db-dev
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||
import { LocalityDetails } from '@/backendTypes'
|
||||
import { LocalityDetails } from '../backendTypes'
|
||||
|
||||
export const validateLocality = (editData: LocalityDetails, fieldName: keyof LocalityDetails) => {
|
||||
const getValidator: {
|
||||
|
||||
Reference in New Issue
Block a user