forked from geolba/tethys.backend
- add model DatasetReference.ts
- add references inside Creta.vue for Submitter /dataset - npm updates - extended enum types - added relations for Dataset.ts
This commit is contained in:
parent
5ce4f0b018
commit
f6d735d0fd
10 changed files with 580 additions and 592 deletions
|
@ -6,6 +6,7 @@ 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 CreateUserValidator from 'App/Validators/CreateUserValidator';
|
||||
// import UpdateUserValidator from 'App/Validators/UpdateUserValidator';
|
||||
import { schema, CustomMessages, rules } from '@ioc:Adonis/Core/Validator';
|
||||
|
@ -15,8 +16,9 @@ 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 { TitleTypes, DescriptionTypes, ContributorTypes, PersonNameTypes } from 'Contracts/enums';
|
||||
import { TitleTypes, DescriptionTypes, ContributorTypes, PersonNameTypes, ReferenceIdentifierTypes, RelationTypes } from 'Contracts/enums';
|
||||
import type { ModelQueryBuilderContract } from '@ioc:Adonis/Lucid/Orm';
|
||||
import DatasetReference from 'App/Models/DatasetReference';
|
||||
|
||||
export default class DatasetController {
|
||||
public async index({ auth, request, inertia }: HttpContextContract) {
|
||||
|
@ -115,6 +117,10 @@ export default class DatasetController {
|
|||
.map(([key, value]) => ({ value: key, label: value })),
|
||||
// descriptiontypes: DescriptionTypes
|
||||
projects: projects,
|
||||
referenceIdentifierTypes: Object.entries(ReferenceIdentifierTypes)
|
||||
.map(([key, value]) => ({ value: key, label: value })),
|
||||
relationTypes: Object.entries(RelationTypes)
|
||||
.map(([key, value]) => ({ value: key, label: value })),
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -239,6 +245,17 @@ export default class DatasetController {
|
|||
depth_min: schema.number.optional([rules.requiredIfExists('depth_max')]),
|
||||
depth_max: schema.number.optional([rules.requiredIfExists('depth_min')]),
|
||||
}),
|
||||
references: schema.array([rules.uniqueArray('value')]).members(
|
||||
schema.object().members({
|
||||
value: schema.string({ trim: true }, [
|
||||
rules.minLength(3),
|
||||
rules.maxLength(255),
|
||||
]),
|
||||
type: schema.enum(Object.values(ReferenceIdentifierTypes)),
|
||||
relation: schema.enum(Object.values(RelationTypes)),
|
||||
// language: schema.string({ trim: true }, [rules.minLength(2), rules.maxLength(255)]),
|
||||
}),
|
||||
),
|
||||
subjects: schema.array([rules.minLength(3), rules.uniqueArray('value')]).members(
|
||||
schema.object().members({
|
||||
value: schema.string({ trim: true }, [
|
||||
|
@ -263,6 +280,7 @@ export default class DatasetController {
|
|||
}
|
||||
return response.redirect().back();
|
||||
}
|
||||
|
||||
public async store({ auth, request, response, session }: HttpContextContract) {
|
||||
// node ace make:validator CreateDataset
|
||||
try {
|
||||
|
@ -277,134 +295,15 @@ export default class DatasetController {
|
|||
throw error;
|
||||
}
|
||||
|
||||
// const user = new User();
|
||||
// user.email = 'example@example.com';
|
||||
// user.password = 'password';
|
||||
// await user.useTransaction(trx).save();
|
||||
|
||||
let trx: TransactionClientContract | null = null;
|
||||
try {
|
||||
trx = await Database.transaction();
|
||||
const user = (await User.find(auth.user?.id)) as User;
|
||||
|
||||
// const dataset = await user.related('datasets').create({
|
||||
// type: request.input('type'),
|
||||
// creatingCorporation: request.input('creating_corporation'),
|
||||
// language: request.input('language'),
|
||||
// });
|
||||
|
||||
// Create a new instance of the Dataset model:
|
||||
const dataset = new Dataset();
|
||||
dataset.type = request.input('type');
|
||||
dataset.creatingCorporation = request.input('creating_corporation');
|
||||
dataset.language = request.input('language');
|
||||
dataset.embargoDate = request.input('embargo_date');
|
||||
//await dataset.related('user').associate(user); // speichert schon ab
|
||||
// Dataset.$getRelation('user').boot();
|
||||
// Dataset.$getRelation('user').setRelated(dataset, user);
|
||||
// dataset.$setRelated('user', user);
|
||||
await user.useTransaction(trx).related('datasets').save(dataset);
|
||||
|
||||
//store licenses:
|
||||
const licenses: number[] = request.input('licenses', []);
|
||||
dataset.useTransaction(trx).related('licenses').sync(licenses);
|
||||
|
||||
const authors = request.input('authors', []);
|
||||
for (const [key, person] of authors.entries()) {
|
||||
const pivotData = { role: 'author', sort_order: key + 1 };
|
||||
|
||||
if (person.id !== undefined) {
|
||||
await dataset
|
||||
.useTransaction(trx)
|
||||
.related('persons')
|
||||
.attach({
|
||||
[person.id]: {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
const dataPerson = new Person();
|
||||
// use overwritten fill method
|
||||
dataPerson.fill(person);
|
||||
await dataset.useTransaction(trx).related('persons').save(dataPerson, false, {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const contributors = request.input('contributors', []);
|
||||
for (const [key, person] of contributors.entries()) {
|
||||
const pivotData = { role: 'contributor', sort_order: key + 1 };
|
||||
|
||||
if (person.id !== undefined) {
|
||||
await dataset
|
||||
.useTransaction(trx)
|
||||
.related('persons')
|
||||
.attach({
|
||||
[person.id]: {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
const dataPerson = new Person();
|
||||
// use overwritten fill method
|
||||
dataPerson.fill(person);
|
||||
await dataset.useTransaction(trx).related('persons').save(dataPerson, false, {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
//save main and additional titles
|
||||
const titles = request.input('titles', []);
|
||||
for (const titleData of titles) {
|
||||
const title = new Title();
|
||||
title.value = titleData.value;
|
||||
title.language = titleData.language;
|
||||
title.type = titleData.type;
|
||||
await dataset.useTransaction(trx).related('titles').save(title);
|
||||
}
|
||||
|
||||
//save abstract and additional descriptions
|
||||
const descriptions = request.input('descriptions', []);
|
||||
for (const descriptionData of descriptions) {
|
||||
// $descriptionReference = new Description($description);
|
||||
// $dataset->abstracts()->save($descriptionReference);
|
||||
const description = new Description();
|
||||
description.value = descriptionData.value;
|
||||
description.language = descriptionData.language;
|
||||
description.type = descriptionData.type;
|
||||
await dataset.useTransaction(trx).related('descriptions').save(description);
|
||||
}
|
||||
|
||||
//save keywords
|
||||
const keywords = request.input('subjects', []);
|
||||
for (const keywordData of keywords) {
|
||||
// $dataKeyword = new Subject($keyword);
|
||||
// $dataset->subjects()->save($dataKeyword);
|
||||
const keyword = await Subject.firstOrNew({ value: keywordData.value, type: keywordData.type }, keywordData);
|
||||
if (keyword.$isNew === true) {
|
||||
await dataset.useTransaction(trx).related('subjects').save(keyword);
|
||||
} else {
|
||||
await dataset.useTransaction(trx).related('subjects').attach([keyword.id]);
|
||||
}
|
||||
}
|
||||
|
||||
// Dataset.$getRelation('persons').boot();
|
||||
// Dataset.$getRelation('persons').pushRelated(dataset, person)
|
||||
// dataset.$pushRelated('persons', person);
|
||||
await this.createDatasetAndAssociations(user, request, trx);
|
||||
|
||||
await trx.commit();
|
||||
|
||||
console.log('Users and posts created successfully');
|
||||
console.log('Dataset and related models created successfully');
|
||||
} catch (error) {
|
||||
if (trx !== null) {
|
||||
await trx.rollback();
|
||||
|
@ -425,8 +324,6 @@ export default class DatasetController {
|
|||
// fieldName: 'file'
|
||||
// size: 135624
|
||||
|
||||
//const datasetFolder = 'files/' . dataset->id;
|
||||
|
||||
// await coverImage.moveToDisk('./')
|
||||
await coverImage.moveToDisk(
|
||||
'/test_dataset2',
|
||||
|
@ -444,6 +341,110 @@ export default class DatasetController {
|
|||
return response.redirect().back();
|
||||
}
|
||||
|
||||
private async createDatasetAndAssociations(user: User, request: HttpContextContract['request'], trx: TransactionClientContract) {
|
||||
// Create a new instance of the Dataset model:
|
||||
const dataset = new Dataset();
|
||||
dataset.type = request.input('type');
|
||||
dataset.creatingCorporation = request.input('creating_corporation');
|
||||
dataset.language = request.input('language');
|
||||
dataset.embargoDate = request.input('embargo_date');
|
||||
//await dataset.related('user').associate(user); // speichert schon ab
|
||||
// Dataset.$getRelation('user').boot();
|
||||
// Dataset.$getRelation('user').setRelated(dataset, user);
|
||||
// dataset.$setRelated('user', user);
|
||||
await user.useTransaction(trx).related('datasets').save(dataset);
|
||||
|
||||
//store licenses:
|
||||
const licenses: number[] = request.input('licenses', []);
|
||||
dataset.useTransaction(trx).related('licenses').sync(licenses);
|
||||
|
||||
// save authors and contributors
|
||||
await this.savePersons(dataset, request.input('authors', []), 'author', trx);
|
||||
await this.savePersons(dataset, request.input('contributors', []), 'contributor', trx);
|
||||
|
||||
//save main and additional titles
|
||||
const titles = request.input('titles', []);
|
||||
for (const titleData of titles) {
|
||||
const title = new Title();
|
||||
title.value = titleData.value;
|
||||
title.language = titleData.language;
|
||||
title.type = titleData.type;
|
||||
await dataset.useTransaction(trx).related('titles').save(title);
|
||||
}
|
||||
|
||||
// save descriptions
|
||||
const descriptions = request.input('descriptions', []);
|
||||
for (const descriptionData of descriptions) {
|
||||
const description = new Description();
|
||||
description.value = descriptionData.value;
|
||||
description.language = descriptionData.language;
|
||||
description.type = descriptionData.type;
|
||||
await dataset.useTransaction(trx).related('descriptions').save(description);
|
||||
}
|
||||
|
||||
//save references
|
||||
const references = request.input('references', []);
|
||||
for (const referencePayload of references) {
|
||||
const dataReference = new DatasetReference();
|
||||
dataReference.fill(referencePayload);
|
||||
// $dataReference = new DatasetReference($reference);
|
||||
dataset.related('references').save(dataReference);
|
||||
}
|
||||
|
||||
//save keywords
|
||||
const keywords = request.input('subjects', []);
|
||||
for (const keywordData of keywords) {
|
||||
// $dataKeyword = new Subject($keyword);
|
||||
// $dataset->subjects()->save($dataKeyword);
|
||||
const keyword = await Subject.firstOrNew({ value: keywordData.value, type: keywordData.type }, keywordData);
|
||||
if (keyword.$isNew === true) {
|
||||
await dataset.useTransaction(trx).related('subjects').save(keyword);
|
||||
} else {
|
||||
await dataset.useTransaction(trx).related('subjects').attach([keyword.id]);
|
||||
}
|
||||
}
|
||||
|
||||
// save coverage
|
||||
const coverageData = request.input('coverage');
|
||||
if (coverageData) {
|
||||
// const formCoverage = request.input('coverage');
|
||||
const coverage = new Coverage();
|
||||
coverage.fill(coverageData);
|
||||
// await dataset.coverage().save(coverageData);
|
||||
await dataset.useTransaction(trx).related('coverage').save(coverage);
|
||||
// Alternatively, you can associate the dataset with the coverage and then save it:
|
||||
// await coverage.dataset().associate(dataset).save();
|
||||
// await coverage.useTransaction(trx).related('dataset').associate(dataset);
|
||||
}
|
||||
}
|
||||
|
||||
private async savePersons(dataset: Dataset, persons: any[], role: string, trx: TransactionClientContract) {
|
||||
for (const [key, person] of persons.entries()) {
|
||||
const pivotData = { role: role, sort_order: key + 1 };
|
||||
|
||||
if (person.id !== undefined) {
|
||||
await dataset
|
||||
.useTransaction(trx)
|
||||
.related('persons')
|
||||
.attach({
|
||||
[person.id]: {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
const dataPerson = new Person();
|
||||
dataPerson.fill(person);
|
||||
await dataset.useTransaction(trx).related('persons').save(dataPerson, false, {
|
||||
role: pivotData.role,
|
||||
sort_order: pivotData.sort_order,
|
||||
allow_email_contact: false,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public messages: CustomMessages = {
|
||||
'minLength': '{{ field }} must be at least {{ options.minLength }} characters long',
|
||||
'maxLength': '{{ field }} must be less then {{ options.maxLength }} characters long',
|
||||
|
|
Loading…
Add table
editor.link_modal.header
Reference in a new issue