Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 0 additions & 32 deletions .babelrc

This file was deleted.

Binary file added .yarn/install-state.gz
Binary file not shown.
1 change: 1 addition & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
nodeLinker: node-modules
4 changes: 2 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ FROM node:jod-slim AS build

WORKDIR /usr/src/app

COPY package.json yarn.lock tsconfig.json .babelrc ./
COPY package.json yarn.lock tsconfig.json build.mjs ./

RUN yarn install --production=false
RUN yarn install --production=false

COPY ./src/ ./src/

Expand Down
14 changes: 14 additions & 0 deletions build.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { rmSync } from 'node:fs'
import { build } from 'esbuild'

// Limpa a pasta dist antes de gerar novo build
rmSync('dist', { recursive: true, force: true })

await build({
Comment thread
edvaldoszy marked this conversation as resolved.
entryPoints: ['src/index.js'],
bundle: false,
platform: 'node',
target: 'node22',
outdir: 'dist',
format: 'esm',
})
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ services:
POSTGRES_USER: $PG_USERNAME
POSTGRES_PASSWORD: $PG_PASSWORD
volumes:
- postgres_data:/var/lib/postgresql/data
- postgres_data:/var/lib/postgresql
ports:
- ${PG_PORT:-5432}:5432
shm_size: 128mb
Expand Down
7 changes: 4 additions & 3 deletions eslint.config.mts → eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import js from '@eslint/js'
Comment thread
edvaldoszy marked this conversation as resolved.
import stylistic from '@stylistic/eslint-plugin'
import type { ESLint } from 'eslint'
// @ts-expect-error: No declaration file found
import importHelpers from 'eslint-plugin-import-helpers'
import { defineConfig } from 'eslint/config'
Expand All @@ -14,7 +13,9 @@ export default defineConfig([
'mysql/',
'public/',
'coverage/',
'node_modules/'
'node_modules/',
'build.mjs',
'eslint.config.mjs',
]
},
{
Expand All @@ -23,7 +24,7 @@ export default defineConfig([
js,
stylistic,
tseslint,
'import-helpers': importHelpers as unknown as ESLint.Plugin
"import-helpers": importHelpers
},
languageOptions: {
parserOptions: {
Expand Down
23 changes: 6 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,8 @@
"tsc:check": "tsc --noEmit",
"lint:eslint": "eslint --cache",
"lint": "run-p tsc:check lint:eslint",
"clean": "rimraf dist",
"build:app": "babel -d ./dist -x '.js,.ts,.tsx' --copy-files --no-copy-ignored ./src",
"start": "nodemon --ext 'js,ts,tsx' --exec babel-node --extensions '.js,.ts,.tsx' ./src/index.js",
"build": "run-s clean build:app",
"start": "tsx --watch --env-file=.env src/index.js",
"build": "node build.mjs",
"test": "vitest --run",
"test:coverage": "vitest --run --coverage",
"prepare": "husky",
Expand Down Expand Up @@ -57,37 +55,28 @@
"swagger-jsdoc": "6.2.8",
"swagger-ui-express": "5.0.1",
"throttled-queue": "3.0.0",
"tsx": "4.20.6",
"uuid": "13.0.0"
},
"devDependencies": {
"@babel/cli": "7.28.3",
"@babel/core": "7.28.5",
"@babel/node": "7.28.0",
"@babel/plugin-proposal-class-properties": "7.18.6",
"@babel/preset-env": "7.28.5",
"@babel/preset-react": "7.28.5",
"@babel/preset-typescript": "7.28.5",
"@eslint/js": "9.39.1",
"@stylistic/eslint-plugin": "5.5.0",
"@types/express": "5.0.5",
"@types/pg": "^8.16.0",
"@types/react": "19.2.2",
"@types/react-dom": "19.2.2",
"@vitest/coverage-v8": "4.0.7",
"babel-plugin-module-resolver": "5.0.2",
"chai": "6.2.0",
"chai-http": "^5.1.2",
"esbuild": "0.28.0",
"eslint": "9.39.1",
"eslint-plugin-import-helpers": "2.0.1",
"globals": "16.5.0",
"husky": "9.1.7",
"jiti": "2.6.1",
"nodemon": "3.1.10",
"npm-run-all": "4.1.5",
"rimraf": "6.1.2",
"tsx": "4.21.0",
"typescript": "5.9.3",
"typescript-eslint": "8.46.3",
"vitest": "4.0.7"
}
},
"packageManager": "yarn@4.13.0+sha512.5c20ba010c99815433e5c8453112165e673f1c7948d8d2b267f4b5e52097538658388ebc9f9580656d9b75c5cc996f990f611f99304a2197d4c56d21eea370e7"
Comment thread
edvaldoszy marked this conversation as resolved.
Outdated
}
37 changes: 36 additions & 1 deletion src/controllers/tombos-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import models from '../models';
import codigos from '../resources/codigos-http';
import verifyRecaptcha from '../utils/verify-recaptcha';
import { aprovarPendencia } from './pendencias-controller';

const {
Solo, Relevo, Cidade, Estado, Vegetacao, FaseSucessional, Pais, Tipo, LocalColeta, Familia, sequelize,
Genero, Subfamilia, Autor, Coletor, Variedade, Subespecie, TomboFoto, Identificador,
Expand All @@ -35,6 +34,28 @@ function parseDataTombo(valor) {
return null;
}

const getProximoNumeroTombo = async () => {
Comment thread
edvaldoszy marked this conversation as resolved.
const resultado = await Tombo.findOne({
attributes: [
[fn('MAX', col('hcf')), 'max_hcf'],
],
raw: true,
});
const maxNumero = resultado?.max_hcf;
return maxNumero ? Number(maxNumero) + 1 : 1;
};

export const getProximoNumeroTomboEndPoint = async (request, response, next) => {
try {
const proximoNumero = await getProximoNumeroTombo();
response
.status(codigos.BUSCAR_UM_ITEM)
.json({ hcf: proximoNumero });
} catch (error) {
next(error);
}
};

export const cadastro = (request, response, next) => {
const {
principal,
Expand All @@ -51,8 +72,22 @@ export const cadastro = (request, response, next) => {
} = request.body.json;
let tomboCriado = null;

const isNovoTombo = !principal.hcf;

const callback = transaction =>
Promise.resolve()
.then(() => {
if (isNovoTombo) {
Comment thread
edvaldoszy marked this conversation as resolved.
Outdated
return getProximoNumeroTombo();
}
return principal.hcf;
})
.then(hcfGerado => {
if (isNovoTombo) {
principal.hcf = hcfGerado;
}
return undefined;
})
.then(() => {
if (!paisagem || !paisagem.solo_id) {
return undefined;
Expand Down
16 changes: 13 additions & 3 deletions src/database/migration-file-system.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Knex } from 'knex'
import fs from 'node:fs'
import path from 'node:path'
import { pathToFileURL } from 'node:url'

interface Dependencies {
knex: Knex
Expand Down Expand Up @@ -30,6 +31,7 @@ export class MigrationFileSystem {
const fileName = `${timestamp}_${name}`

const upFilePath = path.join(this.migrationsPath, `${fileName}.ts`)
.replace(/\\/g, '/')

fs.writeFileSync(upFilePath, MIGRATION_TEMPLATE)

Expand All @@ -41,17 +43,25 @@ export class MigrationFileSystem {
return files
.filter(file => /\.[jt]s$/.test(file))
.sort()
.map(file => path.join(this.migrationsPath, file))
.map(file => path.join(this.migrationsPath, file).replace(/\\/g, '/'))
}

private async importMigrationModule(name: string): Promise<{ run: (knex: Knex) => Promise<void> }> {
const filePathWithoutExtension = path.join(this.migrationsPath, name)
const isAbsolute = path.isAbsolute(this.migrationsPath)
Comment thread
edvaldoszy marked this conversation as resolved.

const toSpecifier = (fsPath: string): string => {
if (isAbsolute) {
return pathToFileURL(fsPath).href
}
return fsPath.replace(/\\/g, '/')
}

let migrationModule: { run: (knex: Knex) => Promise<void> }
if (fs.existsSync(`${filePathWithoutExtension}.ts`)) {
migrationModule = await import(`${filePathWithoutExtension}.ts`) as { run: (knex: Knex) => Promise<void> }
migrationModule = await import(toSpecifier(`${filePathWithoutExtension}.ts`)) as { run: (knex: Knex) => Promise<void> }
} else if (fs.existsSync(`${filePathWithoutExtension}.js`)) {
migrationModule = await import(`${filePathWithoutExtension}.js`) as { run: (knex: Knex) => Promise<void> }
migrationModule = await import(toSpecifier(`${filePathWithoutExtension}.js`)) as { run: (knex: Knex) => Promise<void> }
} else {
throw new Error(`Migration file ${name} not found`)
}
Expand Down
13 changes: 12 additions & 1 deletion src/routes/tombos.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
alteracao, getNumeroColetor, getUltimoNumeroTombo, getCodigoBarraTombo,
editarCodigoBarra, getUltimoNumeroCodigoBarras, postCodigoBarraTombo,
verificarCoordenada, getUltimoCodigoBarra, deletarCodigoBarras, listagemTombosPorIdentificador,
relatorioPorPeriodo,
relatorioPorPeriodo, getProximoNumeroTomboEndPoint,
} from '../controllers/tombos-controller';
import exportarTombosController from '../controllers/tombos-exportacoes-controller';
import criaJsonMiddleware from '../middlewares/json-middleware';
Expand All @@ -21,6 +21,7 @@ import coletorCadastro from '../validators/coletor-cadastro';
import cadastrarTipoEsquema from '../validators/tipo-cadastro';
import cadastrarTomboEsquema from '../validators/tombo-cadastro';
import listagemTombo from '../validators/tombo-listagem';

/**
* @swagger
* tags:
Expand Down Expand Up @@ -355,6 +356,16 @@ export default app => {
getUltimoNumeroTombo,
]);

app.route('/tombos/proximo_numero')
Comment thread
edvaldoszy marked this conversation as resolved.
.get([
tokensMiddleware([
TIPOS_USUARIOS.CURADOR,
TIPOS_USUARIOS.OPERADOR,
TIPOS_USUARIOS.IDENTIFICADOR,
]),
getProximoNumeroTomboEndPoint,
]);

/**
* @swagger
* /tombos/ultimo_codigo_barra:
Expand Down
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"include": [
"src/",
"test/",
"eslint.config.mts",
"eslint.config.mjs",
Comment thread
JosueModesto marked this conversation as resolved.
"vitest.config.mts"
],
"exclude": [
Expand Down
Loading
Loading