This commit is contained in:
parent
f828ca4491
commit
cb51a4136f
167 changed files with 21485 additions and 21212 deletions
|
@ -1,21 +1,22 @@
|
|||
import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext';
|
||||
import User from 'App/Models/User';
|
||||
import Dataset from 'App/Models/Dataset';
|
||||
import License from 'App/Models/License';
|
||||
import Project from 'App/Models/Project';
|
||||
import Title from 'App/Models/Title';
|
||||
import Description from 'App/Models/Description';
|
||||
import Language from 'App/Models/Language';
|
||||
import Coverage from 'App/Models/Coverage';
|
||||
import Collection from 'App/Models/Collection';
|
||||
import { schema, CustomMessages, rules } from '@ioc:Adonis/Core/Validator';
|
||||
import type { HttpContext } from '@adonisjs/core/http';
|
||||
import User from '#app/Models/User';
|
||||
import Dataset from '#app/Models/Dataset';
|
||||
import License from '#app/Models/License';
|
||||
import Project from '#app/Models/Project';
|
||||
import Title from '#app/Models/Title';
|
||||
import Description from '#app/Models/Description';
|
||||
import Language from '#app/Models/Language';
|
||||
import Coverage from '#app/Models/Coverage';
|
||||
import Collection from '#app/Models/Collection';
|
||||
import { schema, rules } from '@adonisjs/validator';
|
||||
import { CustomMessages } from "@adonisjs/validator/types";
|
||||
import dayjs from 'dayjs';
|
||||
import Person from 'App/Models/Person';
|
||||
import Database from '@ioc:Adonis/Lucid/Database';
|
||||
import { TransactionClientContract } from '@ioc:Adonis/Lucid/Database';
|
||||
import Subject from 'App/Models/Subject';
|
||||
import CreateDatasetValidator from 'App/Validators/CreateDatasetValidator';
|
||||
import UpdateDatasetValidator from 'App/Validators/UpdateDatasetValidator';
|
||||
import Person from '#app/Models/Person';
|
||||
import db from '@adonisjs/lucid/services/db';
|
||||
import { TransactionClientContract } from "@adonisjs/lucid/types/database";
|
||||
import Subject from '#app/Models/Subject';
|
||||
import CreateDatasetValidator from '#app/Validators/CreateDatasetValidator';
|
||||
import UpdateDatasetValidator from '#app/Validators/UpdateDatasetValidator';
|
||||
import {
|
||||
TitleTypes,
|
||||
DescriptionTypes,
|
||||
|
@ -25,20 +26,24 @@ import {
|
|||
RelationTypes,
|
||||
DatasetTypes,
|
||||
SubjectTypes,
|
||||
} from 'Contracts/enums';
|
||||
import type { ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm';
|
||||
import DatasetReference from 'App/Models/DatasetReference';
|
||||
import { cuid } from '@ioc:Adonis/Core/Helpers';
|
||||
import File from 'App/Models/File';
|
||||
} from '#contracts/enums';
|
||||
import { ModelQueryBuilderContract } from "@adonisjs/lucid/types/model";
|
||||
import DatasetReference from '#app/Models/DatasetReference';
|
||||
import { cuid } from '@adonisjs/core/helpers';
|
||||
import File from '#app/Models/File';
|
||||
import ClamScan from 'clamscan';
|
||||
import { ValidationException } from '@ioc:Adonis/Core/Validator';
|
||||
import Drive from '@ioc:Adonis/Core/Drive';
|
||||
import { Exception } from '@adonisjs/core/build/standalone';
|
||||
import { MultipartFileContract } from '@ioc:Adonis/Core/BodyParser';
|
||||
import { ValidationException } from '@adonisjs/validator';
|
||||
// import Drive from '@ioc:Adonis/Core/Drive';
|
||||
import { Exception } from "@adonisjs/core/exceptions";
|
||||
import { MultipartFile } from '@adonisjs/core/types/bodyparser';
|
||||
import * as crypto from 'crypto';
|
||||
import app from '@adonisjs/core/services/app';
|
||||
interface Dictionary {
|
||||
[index: string]: string;
|
||||
}
|
||||
|
||||
export default class DatasetController {
|
||||
public async index({ auth, request, inertia }: HttpContextContract) {
|
||||
public async index({ auth, request, inertia }: HttpContext) {
|
||||
const user = (await User.find(auth.user?.id)) as User;
|
||||
const page = request.input('page', 1);
|
||||
let datasets: ModelQueryBuilderContract<typeof Dataset, Dataset> = Dataset.query();
|
||||
|
@ -105,7 +110,7 @@ export default class DatasetController {
|
|||
});
|
||||
}
|
||||
|
||||
public async create({ inertia }: HttpContextContract) {
|
||||
public async create({ inertia }: HttpContext) {
|
||||
const licenses = await License.query().select('id', 'name_long').where('active', 'true').pluck('name_long', 'id');
|
||||
|
||||
const projects = await Project.query().pluck('label', 'id');
|
||||
|
@ -140,7 +145,7 @@ export default class DatasetController {
|
|||
});
|
||||
}
|
||||
|
||||
public async firstStep({ request, response }: HttpContextContract) {
|
||||
public async firstStep({ request, response }: HttpContext) {
|
||||
const newDatasetSchema = schema.create({
|
||||
language: schema.string({ trim: true }, [
|
||||
rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores
|
||||
|
@ -149,6 +154,7 @@ export default class DatasetController {
|
|||
rights: schema.string([rules.equalTo('true')]),
|
||||
});
|
||||
|
||||
await request.validate({ schema: newDatasetSchema, messages: this.messages });
|
||||
try {
|
||||
// Step 2 - Validate request body against the schema
|
||||
|
||||
|
@ -162,7 +168,7 @@ export default class DatasetController {
|
|||
return response.redirect().back();
|
||||
}
|
||||
|
||||
public async secondStep({ request, response }: HttpContextContract) {
|
||||
public async secondStep({ request, response }: HttpContext) {
|
||||
const newDatasetSchema = schema.create({
|
||||
// first step
|
||||
language: schema.string({ trim: true }, [
|
||||
|
@ -217,7 +223,7 @@ export default class DatasetController {
|
|||
return response.redirect().back();
|
||||
}
|
||||
|
||||
public async thirdStep({ request, response }: HttpContextContract) {
|
||||
public async thirdStep({ request, response }: HttpContext) {
|
||||
const newDatasetSchema = schema.create({
|
||||
// first step
|
||||
language: schema.string({ trim: true }, [
|
||||
|
@ -305,7 +311,7 @@ export default class DatasetController {
|
|||
return response.redirect().back();
|
||||
}
|
||||
|
||||
public async store({ auth, request, response, session }: HttpContextContract) {
|
||||
public async store({ auth, request, response, session }: HttpContext) {
|
||||
// node ace make:validator CreateDataset
|
||||
try {
|
||||
// Step 2 - Validate request body against the schema
|
||||
|
@ -320,7 +326,7 @@ export default class DatasetController {
|
|||
|
||||
let trx: TransactionClientContract | null = null;
|
||||
try {
|
||||
trx = await Database.transaction();
|
||||
trx = await db.transaction();
|
||||
const user = (await User.find(auth.user?.id)) as User;
|
||||
|
||||
await this.createDatasetAndAssociations(user, request, trx);
|
||||
|
@ -341,7 +347,7 @@ export default class DatasetController {
|
|||
// return response.redirect().back();
|
||||
}
|
||||
|
||||
private async createDatasetAndAssociations(user: User, request: HttpContextContract['request'], trx: TransactionClientContract) {
|
||||
private async createDatasetAndAssociations(user: User, request: HttpContext['request'], trx: TransactionClientContract) {
|
||||
// Create a new instance of the Dataset model:
|
||||
const dataset = new Dataset();
|
||||
dataset.type = request.input('type');
|
||||
|
@ -422,7 +428,7 @@ export default class DatasetController {
|
|||
}
|
||||
|
||||
// save data files
|
||||
const uploadedFiles = request.files('files');
|
||||
const uploadedFiles: MultipartFile[] = request.files('files');
|
||||
for (const [index, file] of uploadedFiles.entries()) {
|
||||
try {
|
||||
await this.scanFileForViruses(file.tmpPath); //, 'gitea.lan', 3310);
|
||||
|
@ -439,13 +445,12 @@ export default class DatasetController {
|
|||
const mimeType = file.headers['content-type'] || 'application/octet-stream'; // Fallback to a default MIME type
|
||||
const datasetFolder = `files/${dataset.id}`;
|
||||
// const size = file.size;
|
||||
await file.moveToDisk(
|
||||
datasetFolder,
|
||||
await file.move(
|
||||
app.makePath( datasetFolder),
|
||||
{
|
||||
name: fileName,
|
||||
overwrite: true, // overwrite in case of conflict
|
||||
},
|
||||
'local',
|
||||
);
|
||||
// save file metadata into db
|
||||
const newFile = new File();
|
||||
|
@ -476,7 +481,7 @@ export default class DatasetController {
|
|||
return `file-${randomString1}-${randomString2}-${randomString3}-${randomString4}-${randomString5}.${extension}`;
|
||||
}
|
||||
|
||||
private async scanFileForViruses(filePath, host?: string, port?: number): Promise<void> {
|
||||
private async scanFileForViruses(filePath: string | undefined, host?: string, port?: number): Promise<void> {
|
||||
// const clamscan = await (new ClamScan().init());
|
||||
const opts: ClamScan.Options = {
|
||||
removeInfected: true, // If true, removes infected files
|
||||
|
@ -537,7 +542,7 @@ export default class DatasetController {
|
|||
|
||||
// Helper function to extract pivot attributes from a person object
|
||||
private extractPivotAttributes(person: any) {
|
||||
const pivotAttributes = {};
|
||||
const pivotAttributes: Dictionary = {};
|
||||
for (const key in person) {
|
||||
if (key.startsWith('pivot_')) {
|
||||
// pivotAttributes[key] = person[key];
|
||||
|
@ -596,7 +601,7 @@ export default class DatasetController {
|
|||
};
|
||||
|
||||
// public async release({ params, view }) {
|
||||
public async release({ request, inertia, response }: HttpContextContract) {
|
||||
public async release({ request, inertia, response }: HttpContext) {
|
||||
const id = request.param('id');
|
||||
|
||||
const dataset = await Dataset.query()
|
||||
|
@ -623,7 +628,7 @@ export default class DatasetController {
|
|||
});
|
||||
}
|
||||
|
||||
public async releaseUpdate({ request, response }: HttpContextContract) {
|
||||
public async releaseUpdate({ request, response }: HttpContext) {
|
||||
const id = request.param('id');
|
||||
const dataset = await Dataset.query().preload('files').where('id', id).firstOrFail();
|
||||
|
||||
|
@ -655,7 +660,10 @@ export default class DatasetController {
|
|||
});
|
||||
|
||||
try {
|
||||
await request.validate({ schema: newSchema });
|
||||
await request.validate({
|
||||
schema: newSchema,
|
||||
// reporter: validator.reporters.vanilla,
|
||||
});
|
||||
} catch (error) {
|
||||
// return response.badRequest(error.messages);
|
||||
throw error;
|
||||
|
@ -698,7 +706,7 @@ export default class DatasetController {
|
|||
// throw new GeneralException(trans('exceptions.publish.release.update_error'));
|
||||
}
|
||||
|
||||
public async edit({ request, inertia, response }) {
|
||||
public async edit({ request, inertia, response }: HttpContext) {
|
||||
const id = request.param('id');
|
||||
const datasetQuery = Dataset.query().where('id', id);
|
||||
datasetQuery
|
||||
|
@ -789,7 +797,7 @@ export default class DatasetController {
|
|||
});
|
||||
}
|
||||
|
||||
public async update({ request, response, session }: HttpContextContract) {
|
||||
public async update({ request, response, session }: HttpContext) {
|
||||
try {
|
||||
// await request.validate({ schema: newDatasetSchema, messages: this.messages });
|
||||
await request.validate(UpdateDatasetValidator);
|
||||
|
@ -804,7 +812,7 @@ export default class DatasetController {
|
|||
|
||||
let trx: TransactionClientContract | null = null;
|
||||
try {
|
||||
trx = await Database.transaction();
|
||||
trx = await db.transaction();
|
||||
// const user = (await User.find(auth.user?.id)) as User;
|
||||
// await this.createDatasetAndAssociations(user, request, trx);
|
||||
const dataset = await Dataset.findOrFail(id);
|
||||
|
@ -897,7 +905,7 @@ export default class DatasetController {
|
|||
}
|
||||
|
||||
// handle new uploaded files:
|
||||
const uploadedFiles: MultipartFileContract[] = request.files('files');
|
||||
const uploadedFiles: MultipartFile[] = request.files('files');
|
||||
if (Array.isArray(uploadedFiles) && uploadedFiles.length > 0) {
|
||||
for (const [index, fileData] of uploadedFiles.entries()) {
|
||||
try {
|
||||
|
@ -911,7 +919,11 @@ export default class DatasetController {
|
|||
// move to disk:
|
||||
const fileName = `file-${cuid()}.${fileData.extname}`;
|
||||
const datasetFolder = `files/${dataset.id}`;
|
||||
await fileData.moveToDisk(datasetFolder, { name: fileName, overwrite: true }, 'local');
|
||||
await fileData.moveToDisk(
|
||||
datasetFolder,
|
||||
{ name: fileName, overwrite: true },
|
||||
'local'
|
||||
);
|
||||
// let path = coverImage.filePath;
|
||||
|
||||
//save to db:
|
||||
|
@ -988,7 +1000,7 @@ export default class DatasetController {
|
|||
}
|
||||
}
|
||||
|
||||
public async delete({ request, inertia, response, session }) {
|
||||
public async delete({ request, inertia, response, session }: HttpContext) {
|
||||
const id = request.param('id');
|
||||
try {
|
||||
const dataset = await Dataset.query()
|
||||
|
@ -1022,7 +1034,7 @@ export default class DatasetController {
|
|||
}
|
||||
}
|
||||
|
||||
public async deleteUpdate({ params, session, response }) {
|
||||
public async deleteUpdate({ params, session, response }: HttpContext) {
|
||||
try {
|
||||
const dataset = await Dataset.query().where('id', params.id).preload('files').firstOrFail();
|
||||
|
||||
|
@ -1041,7 +1053,7 @@ export default class DatasetController {
|
|||
if (folderContents.length === 0) {
|
||||
await Drive.delete(datasetFolder);
|
||||
}
|
||||
// delete dataset wirh relation from db
|
||||
// delete dataset wirh relation in db
|
||||
await dataset.delete();
|
||||
session.flash({ message: 'You have deleted 1 dataset!' });
|
||||
return response.redirect().toRoute('dataset.list');
|
||||
|
@ -1059,7 +1071,7 @@ export default class DatasetController {
|
|||
} else if (error instanceof Exception) {
|
||||
// General exception handling
|
||||
return response
|
||||
.flash({ errors: { error: error.message } })
|
||||
.flash('errors', { error: error.message })
|
||||
.redirect()
|
||||
.back();
|
||||
} else {
|
||||
|
|
Loading…
Add table
editor.link_modal.header
Reference in a new issue