import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; // import User from 'App/Models/User'; // import Role from 'App/Models/Role'; // import Database from '@ioc:Adonis/Lucid/Database'; import License from 'App/Models/License'; import Project from 'App/Models/Project'; // import type { ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm'; // import CreateUserValidator from 'App/Validators/CreateUserValidator'; // import UpdateUserValidator from 'App/Validators/UpdateUserValidator'; // import { RenderResponse } from '@ioc:EidelLev/Inertia'; import { schema, CustomMessages, rules } from '@ioc:Adonis/Core/Validator'; import dayjs from 'dayjs'; // import Application from '@ioc:Adonis/Core/Application'; enum TitleTypes { Main = 'Main', Sub = 'Sub', Alternative = 'Alternative', Translated = 'Translated', Other = 'Other', } enum DescriptionTypes { Abstract = 'Abstract', Methods = 'Methods', Series_information = 'Series_information', Technical_info = 'Technical_info', Translated = 'Translated', Other = 'Other', } export default class DatasetController { public async create({ inertia }: HttpContextContract) { const licenses = await License.query().select('id', 'name_long').pluck('name_long', 'id'); const projects = await Project.query().pluck('label', 'id'); const doctypes = { analysisdata: { label: 'Analysis', value: 'analysisdata' }, measurementdata: { label: 'Measurements', value: 'measurementdata' }, monitoring: 'Monitoring', remotesensing: 'Remote Sensing', gis: 'GIS', models: 'Models', mixedtype: 'Mixed Type', }; // const titletypes = { // Sub: 'Sub', // Alternative: 'Alternative', // Translated: 'Translated', // Other: 'Other', // }; // let test = Object.entries(TitleTypes).map(([key, value]) => ({id: key, value: value})) // const languages = await Database.from('languages').select('*').where('active', true); return inertia.render('Submitter/Dataset/Create', { licenses: licenses, doctypes: doctypes, titletypes: Object.entries(TitleTypes) .filter(([value]) => value !== 'Main') .map(([key, value]) => ({ value: key, label: value })), descriptiontypes: Object.entries(DescriptionTypes) .filter(([value]) => value !== 'Abstract') .map(([key, value]) => ({ value: key, label: value })), // descriptiontypes: DescriptionTypes projects: projects, }); } public async firstStep({ request, response }: HttpContextContract) { const newDatasetSchema = schema.create({ language: schema.string({ trim: true }, [ rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores ]), licenses: schema.array([rules.minLength(1)]).members(schema.number()), // define at least one license for the new dataset rights: schema.string([rules.equalTo('true')]), }); try { // Step 2 - Validate request body against the schema await request.validate({ schema: newDatasetSchema, messages: this.messages }); // console.log({ payload }); } catch (error) { // Step 3 - Handle errors // return response.badRequest(error.messages); throw error; } return response.redirect().back(); } public async secondStep({ request, response }: HttpContextContract) { const newDatasetSchema = schema.create({ // first step language: schema.string({ trim: true }, [ rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores ]), licenses: schema.array([rules.minLength(1)]).members(schema.number()), // define at least one license for the new dataset rights: schema.string([rules.equalTo('true')]), // second step type: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), creating_corporation: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), titles: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(TitleTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), descriptions: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(DescriptionTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), authors: schema.array([rules.minLength(1)]).members(schema.object().members({ email: schema.string({ trim: true }) })), // project_id: schema.number(), }); try { // Step 2 - Validate request body against the schema await request.validate({ schema: newDatasetSchema, messages: this.messages }); // console.log({ payload }); } catch (error) { // Step 3 - Handle errors // return response.badRequest(error.messages); throw error; } return response.redirect().back(); } public async thirdStep({ request, response }: HttpContextContract) { const newDatasetSchema = schema.create({ // first step language: schema.string({ trim: true }, [ rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores ]), licenses: schema.array([rules.minLength(1)]).members(schema.number()), // define at least one license for the new dataset rights: schema.string([rules.equalTo('true')]), // second step type: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), creating_corporation: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), titles: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(TitleTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), descriptions: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(DescriptionTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), authors: schema.array([rules.minLength(1)]).members(schema.object().members({ email: schema.string({ trim: true }) })), // third step project_id: schema.number.optional(), embargo_date: schema.date.optional({ format: 'yyyy-MM-dd' }, [rules.after(10, 'days')]), coverage: schema.object().members({ x_min: schema.number(), x_max: schema.number(), y_min: schema.number(), y_max: schema.number(), elevation_absolut: schema.number.optional(), elevation_min: schema.number.optional([rules.requiredIfExists('elevation_max')]), elevation_max: schema.number.optional([rules.requiredIfExists('elevation_min')]), depth_absolut: schema.number.optional(), depth_min: schema.number.optional([rules.requiredIfExists('depth_max')]), depth_max: schema.number.optional([rules.requiredIfExists('depth_min')]), }), subjects: schema.array([rules.minLength(3)]).members( schema.object().members({ value: schema.string({ trim: true }, [ rules.minLength(3), rules.maxLength(255), // rules.unique({ table: 'dataset_subjects', column: 'value' }), ]), // type: schema.enum(Object.values(TitleTypes)), language: schema.string({ trim: true }, [rules.minLength(2), rules.maxLength(255)]), }), ), }); try { // Step 2 - Validate request body against the schema await request.validate({ schema: newDatasetSchema, messages: this.messages }); // console.log({ payload }); } catch (error) { // Step 3 - Handle errors // return response.badRequest(error.messages); throw error; } return response.redirect().back(); } public async store({ request, response, session }: HttpContextContract) { const newDatasetSchema = schema.create({ // first step language: schema.string({ trim: true }, [ rules.regex(/^[a-zA-Z0-9-_]+$/), //Must be alphanumeric with hyphens or underscores ]), licenses: schema.array([rules.minLength(1)]).members(schema.number()), // define at least one license for the new dataset rights: schema.string([rules.equalTo('true')]), // second step type: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), creating_corporation: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), titles: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(TitleTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), descriptions: schema.array([rules.minLength(1)]).members( schema.object().members({ value: schema.string({ trim: true }, [rules.minLength(3), rules.maxLength(255)]), type: schema.enum(Object.values(DescriptionTypes)), language: schema.string({ trim: true }, [ rules.minLength(2), rules.maxLength(255), rules.translatedLanguage('/language', 'type'), ]), }), ), authors: schema.array([rules.minLength(1)]).members(schema.object().members({ email: schema.string({ trim: true }) })), // third step project_id: schema.number.optional(), embargo_date: schema.date.optional({ format: 'yyyy-MM-dd' }, [rules.after(10, 'days')]), coverage: schema.object().members({ x_min: schema.number(), x_max: schema.number(), y_min: schema.number(), y_max: schema.number(), elevation_absolut: schema.number.optional(), elevation_min: schema.number.optional([rules.requiredIfExists('elevation_max')]), elevation_max: schema.number.optional([rules.requiredIfExists('elevation_min')]), depth_absolut: schema.number.optional(), depth_min: schema.number.optional([rules.requiredIfExists('depth_max')]), depth_max: schema.number.optional([rules.requiredIfExists('depth_min')]), }), subjects: schema.array([rules.minLength(3)]).members( schema.object().members({ value: schema.string({ trim: true }, [ rules.minLength(3), rules.maxLength(255), // rules.unique({ table: 'dataset_subjects', column: 'value' }), ]), // type: schema.enum(Object.values(TitleTypes)), language: schema.string({ trim: true }, [rules.minLength(2), rules.maxLength(255)]), }), ), file: schema.file({ size: '100mb', extnames: ['jpg', 'gif', 'png'], }), upload: schema.object().members({ label: schema.string({ trim: true }, [rules.maxLength(255)]), // label: schema.string({ trim: true }, [ // // rules.minLength(3), // // rules.maxLength(255), // ]), }), }); // node ace make:validator CreateUser try { // Step 2 - Validate request body against the schema // await request.validate(CreateUserValidator); await request.validate({ schema: newDatasetSchema, messages: this.messages }); // console.log({ payload }); } catch (error) { // Step 3 - Handle errors // return response.badRequest(error.messages); throw error; } const coverImage = request.file('file'); if (coverImage) { // clientName: 'Gehaltsschema.png' // extname: 'png' // fieldName: 'file' // size: 135624 coverImage.fileName = 'test'; //request.input('upload.label'); //const datasetFolder = 'files/' . dataset->id; // await coverImage.moveToDisk('./') await coverImage.moveToDisk('/test_dataset', { name: 'renamed-file-name.jpg', overwrite: true, // overwrite in case of conflict },'local'); // let path = coverImage.filePath; } // const user = await User.create(input); // if (request.input('roles')) { // const roles: Array = request.input('roles'); // await user.related('roles').attach(roles); // } session.flash('message', 'Dataset has been created successfully'); // return response.redirect().toRoute('user.index'); return response.redirect().back(); } public messages: CustomMessages = { 'minLength': '{{ field }} must be at least {{ options.minLength }} characters long', 'maxLength': '{{ field }} must be less then {{ options.maxLength }} characters long', 'required': '{{ field }} is required', 'unique': '{{ field }} must be unique, and this value is already taken', // 'confirmed': '{{ field }} is not correct', 'licences.minLength': 'at least {{ options.minLength }} permission must be defined', 'licences.*.number': 'Define roles as valid numbers', 'rights.equalTo': 'you must agree to continue', 'titles.0.value.minLength': 'Main Title must be at least {{ options.minLength }} characters long', 'titles.0.value.required': 'Main Title is required', 'titles.*.value.required': 'Additional title is required, if defined', 'titles.*.type.required': 'Additional title type is required', 'titles.*.language.required': 'Additional title language is required', 'titles.*.language.translatedLanguage': 'The language of the translated title must be different from the language of the dataset', 'descriptions.0.value.minLength': 'Main Abstract must be at least {{ options.minLength }} characters long', 'descriptions.0.value.required': 'Main Abstract is required', 'descriptions.*.value.required': 'Additional description is required, if defined', 'descriptions.*.type.required': 'Additional description type is required', 'descriptions.*.language.required': 'Additional description language is required', 'descriptions.*.language.translatedLanguage': 'The language of the translated description must be different from the language of the dataset', 'authors.minLength': 'at least {{ options.minLength }} author must be defined', 'after': `{{ field }} must be older than ${dayjs().add(10, 'day')}`, 'subjects.minLength': 'at least {{ options.minLength }} keywords must be defined', 'subjects.*.value.required': 'keyword value is required', 'subjects.*.value.minLength': 'keyword value must be at least {{ options.minLength }} characters long', 'subjects.*.type.required': 'keyword type is required', 'subjects.*.language.required': 'language of keyword is required', 'file.size': 'file size is to big', 'file.extnames': 'file extension is not supported', }; }