Skip to content

Commit

Permalink
Merge branch '7499-update-react-router-dom' of https://github.com/hur…
Browse files Browse the repository at this point in the history
…idocs/uwazi into testing
  • Loading branch information
mfacar committed Feb 3, 2025
2 parents fbb2ddb + d823a44 commit fd1d871
Show file tree
Hide file tree
Showing 314 changed files with 4,997 additions and 4,598 deletions.
32 changes: 15 additions & 17 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,31 @@ updates:
schedule:
interval: daily
ignore:
- dependency-name: "@types/*"
- dependency-name: "@sentry/node" #6880
versions: [">= 7.114.0"]
- dependency-name: '@types/*'
- dependency-name: '@sentry/node' #6880
versions: ['>= 7.114.0']
- dependency-name: flowbite #Flowbite & flowbite-datepicker upgrade #6993
versions: [">= 2.3.1"]
versions: ['>= 2.3.1']
- dependency-name: flowbite-datepicker #Flowbite & flowbite-datepicker upgrade #6993
versions: [">= 1.2.8"]
versions: ['>= 1.2.8']
- dependency-name: flowbite-react #Flowbite & flowbite-datepicker upgrade #6993
versions: [">= 0.10.1"]
versions: ['>= 0.10.1']
- dependency-name: Mongoose #Mongoose upgrade #7017
versions: [">= 8.4.3"]
- dependency-name: cookie
- dependency-name: "@socket.io*"
- dependency-name: bootstrap
- dependency-name: express-prom-bundle
- dependency-name: immutable
- dependency-name: otplib
- dependency-name: redux
- dependency-name: redux-thunk
- dependency-name: "@typescript-eslint/eslint-plugin"
- dependency-name: "@typescript-eslint/parser"
- dependency-name: '@typescript-eslint/eslint-plugin'
- dependency-name: '@typescript-eslint/parser'
- dependency-name: eslint #6784
- dependency-name: fetch-mock
- dependency-name: react-router-dom
- dependency-name: react-datepicker
- dependency-name: recharts
- dependency-name: "@headlessui/react"
- dependency-name: '@headlessui/react'
- dependency-name: react-player
open-pull-requests-limit: 5
labels:
Expand All @@ -41,19 +39,19 @@ updates:
babel:
applies-to: version-updates
patterns:
- "@babel*"
- '@babel*'
storybook:
applies-to: version-updates
patterns:
- "@storybook*"
- '@storybook*'
sentry:
applies-to: version-updates
patterns:
- "@sentry*"
- '@sentry*'
dnd-kit:
applies-to: version-updates
patterns:
- "@dnd-kit*"
- '@dnd-kit*'
socket.io:
applies-to: version-updates
patterns:
Expand All @@ -70,9 +68,9 @@ updates:
applies-to: version-updates
update-types: [minor, patch]
patterns:
- "*"
- '*'
dev-major-dependencies:
applies-to: version-updates
update-types: [major]
patterns:
- "*"
- '*'
1 change: 1 addition & 0 deletions app/api/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ export default (app, server) => {
require('./files/ocrRoutes').ocrRoutes(app);
require('./settings/routes').default(app);
require('./i18n/routes').default(app);
require('./i18n.v2/routes').translationsRoutes(app);
require('./sync/routes').default(app);
require('./tasks/routes').default(app);
require('./usergroups/routes').default(app);
Expand Down
9 changes: 9 additions & 0 deletions app/api/files/files.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable max-statements */
import entities from 'api/entities';
import { applicationEventsBus } from 'api/eventsbus';
import { mimeTypeFromUrl } from 'api/files/extensionHelper';
Expand Down Expand Up @@ -25,11 +26,19 @@ const deduceMimeType = (_file: FileType) => {
return file;
};

export class UpdateFileError extends Error {
constructor() {
super('Can not update a File that does not exist');
}
}

export const files = {
async save(_file: FileType, index = true) {
const file = deduceMimeType(_file);

const existingFile = file._id ? await filesModel.getById(file._id) : undefined;
if (file._id && !existingFile) throw new UpdateFileError();

const savedFile = await filesModel.save(await validateFile(file));
if (index) {
await search.indexEntities({ sharedId: savedFile.entity }, '+fullText');
Expand Down
17 changes: 10 additions & 7 deletions app/api/files/processDocument.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable max-statements */
import { convertToPDFService } from 'api/services/convertToPDF/convertToPdfService';
import settings from 'api/settings';
import { FileType } from 'shared/types/fileType';
Expand All @@ -10,6 +11,7 @@ export const processPDF = async (
file: FileType & { destination?: string },
detectLanguage = true
) => {
let thumbnail;
const pdf = new PDF(file);
const upload = await files.save({
...file,
Expand All @@ -24,7 +26,13 @@ export const processPDF = async (
conversion.language = file.language;
}

const thumbnail = await pdf.createThumbnail(upload._id.toString());
const saved = await files.save({
...upload,
...conversion,
status: 'ready',
});

thumbnail = await pdf.createThumbnail(upload._id.toString());

await files.save({
entity: entitySharedId,
Expand All @@ -34,18 +42,13 @@ export const processPDF = async (
mimetype: 'image/jpeg',
});

const saved = await files.save({
...upload,
...conversion,
status: 'ready',
});

return saved;
} catch (e) {
await files.save({
...upload,
status: 'failed',
});

throw e;
}
};
Expand Down
27 changes: 27 additions & 0 deletions app/api/files/specs/files.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import testingDB from 'api/utils/testing_db';
import { testingEnvironment } from 'api/utils/testingEnvironment';
import { files, UpdateFileError } from '../files';

describe('Files', () => {
beforeEach(async () => {
await testingEnvironment.setUp({});
});

afterAll(async () => testingEnvironment.tearDown());

it('should not update a File if no longer exist', async () => {
const promise = files.save({
_id: testingDB.id(),
filename: 'any_file_name',
originalname: 'any_original_name',
entity: '123',
language: 'en',
});

await expect(promise).rejects.toEqual(new UpdateFileError());

const [result] = await files.get({});

expect(result).toBeUndefined();
});
});
19 changes: 18 additions & 1 deletion app/api/files/specs/processDocument.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import testingDB from 'api/utils/testing_db';
import {
convertToPDFService,
MimeTypeNotSupportedForConversion,
} from 'api/services/convertToPDF/convertToPdfService';
import { testingEnvironment } from 'api/utils/testingEnvironment';
// eslint-disable-next-line node/no-restricted-import
import { writeFile } from 'fs/promises';
import { files } from '../files';
import { files, UpdateFileError } from '../files';
import { attachmentsPath, setupTestUploadedPaths } from '../filesystem';
import { processDocument } from '../processDocument';

Expand Down Expand Up @@ -76,4 +77,20 @@ describe('processDocument', () => {
expect(file).toBeUndefined();
});
});

it('should not persist file or thumbnail if there is an UpdateFileError', async () => {
const _id = testingDB.id();
const promise = processDocument('any_entity_shared_id', {
_id,
filename: 'any_file_name',
originalname: 'any_original_name',
});

await expect(promise).rejects.toEqual(new UpdateFileError());
const [file] = await files.get({ _id });
const [thumbnail] = await files.get({ entity: _id, type: 'thumbnail' });

expect(file).toBeUndefined();
expect(thumbnail).toBeUndefined();
});
});
54 changes: 54 additions & 0 deletions app/api/i18n.v2/routes/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import { Application, Request } from 'express';
import { needsAuthorization } from 'api/auth';
import { validation } from 'api/utils';
import translations from 'api/i18n';
import { getTranslationsEntriesV2 } from 'api/i18n/v2_support';

const translationsRoutes = (app: Application) => {
app.get('/api/v2/translations', async (_req: Request, res) => {
const translationsV2 = await getTranslationsEntriesV2();
const translationList = await translationsV2.all();
res.json(translationList);
});

app.post(
'/api/v2/translations',
needsAuthorization(),
validation.validateRequest({
type: 'object',
properties: {
body: {
type: 'array',
items: {
type: 'object',
properties: {
_id: { type: 'string' },
language: { type: 'string' },
key: { type: 'string' },
value: { type: 'string' },
context: {
type: 'object',
properties: {
id: { type: 'string' },
label: { type: 'string' },
type: { type: 'string' },
},
required: ['id', 'label', 'type'],
},
},
required: ['language', 'key', 'value', 'context'],
},
},
},
required: ['body'],
}),
async (req, res) => {
await translations.v2StructureSave(req.body);
req.sockets.emitToCurrentTenant('translationKeysChange', req.body);
res.status(200);
res.json({ success: true });
}
);
};

export { translationsRoutes };
102 changes: 102 additions & 0 deletions app/api/i18n.v2/routes/specs/routes.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import 'isomorphic-fetch';
import request from 'supertest';

import { TranslationDBO } from 'api/i18n.v2/schemas/TranslationDBO';
import { getFixturesFactory } from 'api/utils/fixturesFactory';
import { testingEnvironment } from 'api/utils/testingEnvironment';
import { TestEmitSources, iosocket, setUpApp } from 'api/utils/testingRoutes';
import { UserRole } from 'shared/types/userSchema';
import { translationsRoutes } from '..';

describe('i18n translations V2 routes', () => {
const createTranslationDBO = getFixturesFactory().v2.database.translationDBO;
const app = setUpApp(translationsRoutes, (req, _res, next) => {
req.user = {
username: 'admin',
role: UserRole.ADMIN,
email: 'admin@test.com',
};
// @ts-ignore
req.file = { path: 'filder/filename.ext' };
next();
});

beforeEach(async () => {
const translationsV2: TranslationDBO[] = [
createTranslationDBO('Search', 'Buscar', 'es', {
id: 'System',
type: 'Entity',
label: 'User Interface',
}),
createTranslationDBO('Search', 'Search', 'en', {
id: 'System',
type: 'Uwazi UI',
label: 'User Interface',
}),
];
await testingEnvironment.setUp(
{
settings: [
{
languages: [
{ key: 'en', label: 'English', default: true },
{ key: 'es', label: 'Spanish', default: false },
],
},
],
translationsV2,
},
'index_i18n_v2_routes'
);
});

afterEach(() => {
iosocket.emit.mockReset();
});

afterAll(async () => {
await testingEnvironment.tearDown();
});

describe('/api/v2/translations', () => {
it('should update the translations and emit translationKeysChange event', async () => {
const response = await request(app)
.post('/api/v2/translations')
.send([
{
language: 'es',
key: 'Search',
value: 'Búsqueda',
context: {
id: 'System',
label: 'User Interface',
type: 'Uwazi UI',
},
},
]);
expect(response.status).toEqual(200);
expect(iosocket.emit).toHaveBeenCalledWith(
'translationKeysChange',
TestEmitSources.currentTenant,
[
{
context: { id: 'System', label: 'User Interface', type: 'Uwazi UI' },
key: 'Search',
language: 'es',
value: 'Búsqueda',
},
]
);
});

it('should handle invalid POST request payload', async () => {
const response = await request(app)
.post('/api/v2/translations')
.send({ invalidKey: 'value' }); // Invalid payload
expect(response.status).toBe(400);
expect(response.body).toEqual(
expect.objectContaining({ prettyMessage: 'validation failed' })
);
});
});
});
2 changes: 2 additions & 0 deletions app/api/i18n/routes.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable max-lines */
import { createError, validation } from 'api/utils';
import settings from 'api/settings';
import entities from 'api/entities';
Expand Down Expand Up @@ -59,6 +60,7 @@ async function deleteLanguage(key: LanguageISO6391, req: Request) {

type TranslationsRequest = Request & { query: { context: string } };

// eslint-disable-next-line max-statements
export default (app: Application) => {
app.get(
'/api/translations',
Expand Down
Loading

0 comments on commit fd1d871

Please sign in to comment.