diff --git a/apps/metadata-utils/src/types.ts b/apps/metadata-utils/src/types.ts index 2aab5dfeb6..c31dd39a4f 100644 --- a/apps/metadata-utils/src/types.ts +++ b/apps/metadata-utils/src/types.ts @@ -76,7 +76,6 @@ export interface ITableMetaData { description?: string; tableType: string; columns: IColumn[]; - schemaId: string; semantics?: string[]; settings?: ISetting[]; } diff --git a/apps/molgenis-components/src/client/client.ts b/apps/molgenis-components/src/client/client.ts index af45bca358..16e426caf8 100644 --- a/apps/molgenis-components/src/client/client.ts +++ b/apps/molgenis-components/src/client/client.ts @@ -62,8 +62,7 @@ const client: IClient = { ) => { const schemaMetaData = await fetchSchemaMetaData(schemaId); const tableMetaData = schemaMetaData.tables.find( - (table: ITableMetaData) => - table.id === tableId && table.schemaId === schemaMetaData.id + (table: ITableMetaData) => table.id === tableId ); const filter = tableMetaData?.columns ?.filter((column: IColumn) => column.key === 1) @@ -167,12 +166,10 @@ const metadataQuery = `{ _schema { id, tables { - schemaId, id, label, description, tableType, - schemaId, semantics, columns { id, @@ -395,8 +392,7 @@ async function convertRowToPrimaryKey( ): Promise> { const schema = await fetchSchemaMetaData(schemaId); const tableMetadata = schema.tables.find( - (table: ITableMetaData) => - table.id === tableId && table.schemaId === schema.id + (table: ITableMetaData) => table.id === tableId ); if (!tableMetadata?.columns) { throw new Error("Empty columns in metadata"); diff --git a/apps/molgenis-components/src/client/queryBuilder.ts b/apps/molgenis-components/src/client/queryBuilder.ts index 16afa64364..807b1135c8 100644 --- a/apps/molgenis-components/src/client/queryBuilder.ts +++ b/apps/molgenis-components/src/client/queryBuilder.ts @@ -57,8 +57,6 @@ const getColumns = ( tableId: string, tableStore: ITableMetaData[] ) => { - const result = tableStore.find( - (table) => table.id === tableId && table.schemaId === schemaId - ); + const result = tableStore.find((table) => table.id === tableId); return result?.columns || []; }; diff --git a/apps/molgenis-components/src/components/forms/RowEdit.vue b/apps/molgenis-components/src/components/forms/RowEdit.vue index 3d62170d2d..ac264efb13 100644 --- a/apps/molgenis-components/src/components/forms/RowEdit.vue +++ b/apps/molgenis-components/src/components/forms/RowEdit.vue @@ -188,7 +188,7 @@ export default { equals: await convertRowToPrimaryKey( this.internalValues[changedColumn.id], overlappingKey.refTableId, - overlappingKey.refSchemaId + overlappingKey.refSchemaId || this.schemaMetaData.schemaId ), }, }; diff --git a/apps/nuxt3-ssr/gql/metadata.js b/apps/nuxt3-ssr/gql/metadata.js index 44b1900fcd..526e5c6f91 100644 --- a/apps/nuxt3-ssr/gql/metadata.js +++ b/apps/nuxt3-ssr/gql/metadata.js @@ -9,7 +9,6 @@ export default gql` label tableType description - schemaId semantics columns { id diff --git a/apps/schema/src/components/Schema.vue b/apps/schema/src/components/Schema.vue index 98528e5751..1a30bf549f 100644 --- a/apps/schema/src/components/Schema.vue +++ b/apps/schema/src/components/Schema.vue @@ -188,7 +188,6 @@ export default { } }); tables.forEach((table) => { - delete table.schemaId; table.columns = table.columns ? table.columns.filter((column) => column.table === table.name) : []; diff --git a/apps/schema/src/utils.ts b/apps/schema/src/utils.ts index 57de62252e..abf9df93bd 100644 --- a/apps/schema/src/utils.ts +++ b/apps/schema/src/utils.ts @@ -11,7 +11,6 @@ export const schemaQuery = gql` name tables { name - schemaName tableType inheritName labels { @@ -63,10 +62,7 @@ export function addOldNamesAndRemoveMeta(rawSchema: any) { //normal tables let tables = !schema.tables ? [] - : schema.tables.filter( - (table) => - table.tableType !== "ONTOLOGIES" && table.schemaName === schema.name - ); + : schema.tables.filter((table) => table.tableType !== "ONTOLOGIES"); tables.forEach((t) => { t.oldName = t.name; if (t.columns) { @@ -83,10 +79,7 @@ export function addOldNamesAndRemoveMeta(rawSchema: any) { }); schema.ontologies = !schema.tables ? [] - : schema.tables.filter( - (table) => - table.tableType === "ONTOLOGIES" && table.schemaName === schema.name - ); + : schema.tables.filter((table) => table.tableType === "ONTOLOGIES"); //set old name so we can delete them properly schema.ontologies.forEach((o) => { o.oldName = o.name; @@ -205,7 +198,6 @@ export function addTableIdsLabelsDescription(originalTable: ITableMetaData) { table.id = convertToPascalCase(table.name); table.label = getLocalizedLabel(table); table.description = getLocalizedDescription(table, "en"); - table.schemaId = table.schemaName; table.inheritId = convertToPascalCase(table.inheritName); table.columns = table.columns.map((column) => { column.id = convertToCamelCase(column.name); diff --git a/apps/tables/src/App.vue b/apps/tables/src/App.vue index ae4077c5b2..ffbff26043 100644 --- a/apps/tables/src/App.vue +++ b/apps/tables/src/App.vue @@ -43,7 +43,7 @@ export default { this.error = null; request( "graphql", - "{_schema{id,label,tables{id,label,tableType,schemaId,description,columns{id,label,columnType,key,refTableId,required,description}}}}" + "{_schema{id,label,tables{id,label,tableType,description,columns{id,label,columnType,key,refTableId,required,description}}}}" ) .then((data) => { this.schema = data._schema; diff --git a/apps/tables/src/components/ListTables.vue b/apps/tables/src/components/ListTables.vue index 67171c7f74..7e23a9e3cf 100644 --- a/apps/tables/src/components/ListTables.vue +++ b/apps/tables/src/components/ListTables.vue @@ -63,20 +63,16 @@ export default { } if (this.search && this.search.trim().length > 0) { let terms = this.search.toLowerCase().split(" "); - return this.schema.tables - .filter((table) => table.schemaId === this.schema.id) - .filter((table) => - terms.every( - (term) => - table.label.toLowerCase().includes(term) || - (table.description && - table.description.toLowerCase().includes(term)) - ) - ); - } else { - return this.schema.tables.filter( - (table) => table.schemaId === this.schema.id + return this.schema.tables.filter((table) => + terms.every( + (term) => + table.label.toLowerCase().includes(term) || + (table.description && + table.description.toLowerCase().includes(term)) + ) ); + } else { + return this.schema.tables; } }, tables() { diff --git a/apps/tailwind-components/components/form/Fields.vue b/apps/tailwind-components/components/form/Fields.vue index 4ef4bd18c5..475ab8ddd2 100644 --- a/apps/tailwind-components/components/form/Fields.vue +++ b/apps/tailwind-components/components/form/Fields.vue @@ -43,11 +43,19 @@ const chapters = computed(() => { }); const dataMap = reactive( - Object.fromEntries(props.metadata.columns.map((column) => [column.id, ""])) + Object.fromEntries( + props.metadata.columns + .filter((column) => column.columnType !== "HEADING") + .map((column) => [column.id, ""]) + ) ); const errorMap = reactive( - Object.fromEntries(props.metadata.columns.map((column) => [column.id, []])) + Object.fromEntries( + props.metadata.columns + .filter((column) => column.columnType !== "HEADING") + .map((column) => [column.id, []]) + ) ); const numberOffFieldsWithErrors = computed(() => diff --git a/apps/tailwind-components/composables/fetchTableData.ts b/apps/tailwind-components/composables/fetchTableData.ts index 7b8e03310b..38522c4876 100644 --- a/apps/tailwind-components/composables/fetchTableData.ts +++ b/apps/tailwind-components/composables/fetchTableData.ts @@ -69,7 +69,7 @@ export const getColumnIds = async ( const metaData = await fetchMetadata(schemaId); const columns = metaData.tables.find( - (table) => table.id === tableId && table.schemaId === schemaId + (table) => table.id === tableId )?.columns || []; let gqlFields = ""; diff --git a/apps/ui/pages/[schema]/index.vue b/apps/ui/pages/[schema]/index.vue index 16a042905d..7c3abf050f 100644 --- a/apps/ui/pages/[schema]/index.vue +++ b/apps/ui/pages/[schema]/index.vue @@ -26,7 +26,7 @@ const { data } = await useFetch>(`/${schema}/graphql`, { key: "databases", method: "POST", body: { - query: `{_schema{id,label,tables{id,label,tableType,schemaId,description}}}`, + query: `{_schema{id,label,tables{id,label,tableType,description}}}`, }, }); diff --git a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java index 8e2faca81f..d974360f86 100644 --- a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java +++ b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/DataModels.java @@ -25,7 +25,8 @@ public enum Profile { BEACON_V2("_profiles/BeaconV2.yaml"), GDI("_profiles/GDI.yaml"), SHARED_STAGING("_profiles/SharedStaging.yaml"), - IMAGE_TEST("_profiles/ImageTest.yaml"); + IMAGE_TEST("_profiles/ImageTest.yaml"), + PET_STORE("_profiles/PetStore.yaml"); public static boolean hasProfile(String nameOther) { return Arrays.stream(values()).anyMatch(profile -> profile.name().equals(nameOther)); @@ -48,7 +49,6 @@ public Task getImportTask(Schema schema, boolean includeDemoData) { public enum Regular { DIRECTORY(DirectoryLoader::new), - PET_STORE(PetStoreLoader::new), ERN_DASHBOARD(DashboardLoader::new), PROJECTMANAGER(ProjectManagerLoader::new), BIOBANK_DIRECTORY(BiobankDirectoryLoader::new), diff --git a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java b/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java deleted file mode 100644 index 177496a940..0000000000 --- a/backend/molgenis-emx2-datamodels/src/main/java/org/molgenis/emx2/datamodels/PetStoreLoader.java +++ /dev/null @@ -1,233 +0,0 @@ -package org.molgenis.emx2.datamodels; - -import static org.molgenis.emx2.Column.column; -import static org.molgenis.emx2.ColumnType.*; -import static org.molgenis.emx2.TableMetadata.table; - -import org.molgenis.emx2.*; -import org.molgenis.emx2.io.ImportDataModelTask; -import org.molgenis.emx2.sql.SqlDatabase; - -public class PetStoreLoader extends ImportDataModelTask { - - public static final String CATEGORY = "Category"; - public static final String TAG = "Tag"; - public static final String NAME = "name"; - public static final String PET = "Pet"; - public static final String ORDER = "Order"; - public static final String USER = "User"; - public static final String CATEGORY_COLUMN = "category"; - public static final String STATUS = "status"; - public static final String WEIGHT = "weight"; - public static final String ORDER_ID = "orderId"; - public static final String QUANTITY = "quantity"; - public static final String PRICE = "price"; - public static final String COMPLETE = "complete"; - public static final String EMAIL = "email"; - public static final String PARENT = "parent"; - public static final String COLORS = "colors"; - public static final String SPECIES = "species"; - public static final String MAMMALS = "mammals"; - - public PetStoreLoader(Schema schema, Boolean includeDemoData) { - super(schema, includeDemoData); - } - - @Override - public void run() { - this.start(); - getSchema().migrate(getSchemaMetadata()); - if (isIncludeDemoData()) { - loadExampleData(getSchema()); - } - this.complete(); - } - - public static SchemaMetadata getSchemaMetadata() { - SchemaMetadata schema = new SchemaMetadata(); - schema.create(table(CATEGORY).add(column(NAME).setPkey())); - - schema.create( - table(PET) - .add(column(NAME).setDescription("the name").setPkey()) - .add(column(CATEGORY_COLUMN).setType(REF).setRefTable(CATEGORY).setRequired(true)) - .add(column("photoUrls").setType(STRING_ARRAY)) - .add( - column("details") - .setType(HEADING) - .setDescription( - "Details")) // add a layout element, for now html formatting not allowed - .add(column(STATUS)) // todo enum: available, pending, sold - .add(column("tags").setType(ONTOLOGY_ARRAY).setRefTable(TAG)) - .add(column(WEIGHT).setType(DECIMAL).setRequired(true)) - .setDescription("My pet store example table")); - - schema.create( - table(ORDER) - .add(column(ORDER_ID).setPkey().setType(AUTO_ID).setComputed("ORDER:${mg_autoid}")) - .add(column("pet").setType(REF).setRefTable(PET)) - .add( - column(QUANTITY) - .setType(LONG) - .setValidation("if(quantity < 1) 'quantity should be >= 1'")) - .add(column(PRICE).setType(DECIMAL).setValidation("price >= 1")) - .add(column(COMPLETE).setType(BOOL)) // todo: default false - .add(column(STATUS))); // todo enum: placed, approved, delivered - - // refBack - schema - .getTableMetadata(PET) - .add(column("orders").setType(REFBACK).setRefTable(ORDER).setRefBack("pet")); - - schema.create( - table(USER) - .add(column("username").setPkey()) - .add(column("firstName")) - .add(column("lastName")) - .add(column("picture").setType(FILE)) - .add(column(EMAIL).setType(ColumnType.EMAIL)) - .add(column("password")) // todo: password type - .add(column("phone")) // todo: validation phone - .add(column("userStatus").setType(INT)) - .add(column("pets").setType(REF_ARRAY).setRefTable(PET))); - - return schema; - } - - private void loadExampleData(Schema schema) { - final String shopviewer = "shopviewer"; - final String shopmanager = "shopmanager"; - final String shopowner = "shopowner"; - final String costumer = "costumer"; - - // initialize users - if (!schema.getDatabase().hasUser(shopmanager)) { - schema.getDatabase().setUserPassword(shopmanager, shopmanager); - } - if (!schema.getDatabase().hasUser(shopviewer)) { - schema.getDatabase().setUserPassword(shopviewer, shopviewer); - } - if (!schema.getDatabase().hasUser(shopowner)) { - schema.getDatabase().setUserPassword(shopowner, shopowner); - } - if (!schema.getDatabase().hasUser(costumer)) { - schema.getDatabase().setUserPassword(costumer, costumer); - } - schema.addMember(shopmanager, "Manager"); - schema.addMember(shopviewer, "Viewer"); - schema.addMember(shopowner, "Owner"); - schema.addMember(costumer, "Range"); - - schema - .getTable(CATEGORY) - .insert( - new Row().set(NAME, "cat"), - new Row().set(NAME, "dog"), - new Row().set(NAME, "mouse"), - new Row().set(NAME, "bird"), - new Row().set(NAME, "ant"), - new Row().set(NAME, "caterpillar")); - schema - .getTable(TAG) - .insert( - new Row().set(NAME, COLORS), - new Row().set(NAME, "red").set(PARENT, COLORS), - new Row().set(NAME, "green").set(PARENT, COLORS), - new Row().set(NAME, "blue").set(PARENT, COLORS), - new Row().set(NAME, "purple").set(PARENT, COLORS), - new Row().set(NAME, SPECIES), - new Row().set(NAME, MAMMALS).set(PARENT, SPECIES), - new Row().set(NAME, "carnivorous mammals").set(PARENT, MAMMALS), - new Row().set(NAME, "herbivorous mammals").set(PARENT, MAMMALS), - new Row().set(NAME, "birds").set(PARENT, SPECIES), - new Row().set(NAME, "insect").set(PARENT, SPECIES)); - - schema - .getTable(PET) - .insert( - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "pooky") - .set(STATUS, "available") - .set(WEIGHT, 9.4), - new Row() - .set(CATEGORY_COLUMN, "dog") - .set("name", "spike") - .set(STATUS, "sold") - .set("tags", "red,green") - .set(WEIGHT, 15.7), - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "tom") - .set("tags", "red") - .set(STATUS, "available") - .set(WEIGHT, 3.14), - new Row() - .set(CATEGORY_COLUMN, "cat") - .set("name", "sylvester") - .set("tags", "purple") - .set(SPECIES, "carnivorous mammals") - .set(STATUS, "available") - .set(WEIGHT, 1.337), - new Row() - .set(CATEGORY_COLUMN, "mouse") - .set("name", "jerry") - .set("tags", "blue") - .set(STATUS, "available") - .set(WEIGHT, 0.18), - new Row() - .set(CATEGORY_COLUMN, "bird") - .set("name", "tweety") - .set("tags", "red") - .set(STATUS, "available") - .set(WEIGHT, 0.1), - new Row() - .set(CATEGORY_COLUMN, "caterpillar") - .set("name", "the very hungry caterpillar") - .set(STATUS, "available") - .set(SPECIES, "insect") - .set("tags", "green") - .set(WEIGHT, 0.5), - new Row() - .set(CATEGORY_COLUMN, "ant") - .set("name", "fire ant") - .set(STATUS, "available") - .set(SPECIES, "insect") - .set("tags", "purple,red,green") - .set(WEIGHT, 0.01)); - - schema - .getTable(ORDER) - .insert( - new Row() - .set("pet", "pooky") - .set(QUANTITY, 1l) - .set(PRICE, 9.99) - .set(COMPLETE, true) - .set(STATUS, "delivered"), - new Row() - .set("pet", "spike") - .set(PRICE, 14.99) - .set(QUANTITY, 7l) - .set(COMPLETE, false) - .set(STATUS, "approved")); - - schema - .getTable(USER) - .insert( - new Row() - .set("username", "bofke") - .set("pets", "spike,pooky,the very hungry caterpillar,fire ant")); - - schema.addMember(SqlDatabase.ANONYMOUS, Privileges.VIEWER.toString()); - - schema - .getMetadata() - .setSetting( - "reports", - "[{\"id\":\"report1\",\"description\":\"pet report\",\"sql\":\"select * from \\\"Pet\\\"\"}," - + "{\"id\":\"report2\",\"description\":\"pet report with parameters\",\"sql\":\"select * from \\\"Pet\\\" p where p.name=ANY(${name:string_array})\"}," - + "{\"id\":\"report3\",\"description\":\"jsonb\",\"sql\":\"SELECT jsonb_agg(to_jsonb(\\\"Pet\\\")) AS result FROM \\\"Pet\\\"\"}," - + "{\"id\":\"report4\",\"description\":\"jsonb rows\",\"sql\":\"SELECT to_jsonb(\\\"Pet\\\") AS result FROM \\\"Pet\\\"\"}]"); - } -} diff --git a/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java b/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java index 24c0e40449..e404f3d395 100644 --- a/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java +++ b/backend/molgenis-emx2-fairdatapoint/src/test/java/org/molgenis/emx2/fairdatapoint/FAIRDataPointNoCatalogsTest.java @@ -3,7 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import io.javalin.http.Context; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java index 749df2d313..9748569f60 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/graphql/GraphqlSchemaFieldFactory.java @@ -282,14 +282,6 @@ public class GraphqlSchemaFieldFactory { GraphQLFieldDefinition.newFieldDefinition() .name(GraphqlConstants.ID) .type(Scalars.GraphQLString)) - .field( - GraphQLFieldDefinition.newFieldDefinition() - .name(GraphqlConstants.SCHEMA_NAME) - .type(Scalars.GraphQLString)) - .field( - GraphQLFieldDefinition.newFieldDefinition() - .name(GraphqlConstants.SCHEMA_ID) - .type(Scalars.GraphQLString)) .field( GraphQLFieldDefinition.newFieldDefinition() .name(GraphqlConstants.INHERIT_NAME) @@ -481,10 +473,6 @@ public class GraphqlSchemaFieldFactory { GraphQLInputObjectField.newInputObjectField() .name(TABLE_TYPE) .type(Scalars.GraphQLString)) - .field( - GraphQLInputObjectField.newInputObjectField() - .name(SCHEMA_NAME) - .type(Scalars.GraphQLString)) .build(); public GraphqlSchemaFieldFactory() { diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java index c308a1e70e..cd3676ae3a 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Column.java @@ -60,6 +60,7 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini this.name = column.getName(); this.labels = column.getLabels().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.oldName = column.getOldName(); @@ -70,11 +71,13 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini } if (column.isReference()) { if (column.getSchema().getDatabase() != null) { + if (!column.getRefSchemaName().equals(column.getSchemaName())) { + this.refSchemaId = column.getRefSchemaName(); + this.refSchemaName = column.getRefSchemaName(); + } this.refTableId = column.getRefTable().getIdentifier(); this.refLabelDefault = column.getRefLabelDefault(); } - this.refSchemaId = column.getRefSchemaName(); - this.refSchemaName = column.getRefSchemaName(); this.refTableName = column.getRefTableName(); if (column.getRefLinkColumn() != null) { if (column.getTable().getSchema().getDatabase() != null) { @@ -101,6 +104,7 @@ public Column(org.molgenis.emx2.Column column, TableMetadata table, boolean mini this.defaultValue = column.getDefaultValue(); this.descriptions = column.getDescriptions().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.semantics = column.getSemantics(); @@ -141,6 +145,7 @@ public org.molgenis.emx2.Column getColumnMetadata(TableMetadata tm) { c.setVisible(visible); c.setComputed(computed); c.setReadonly(readonly); + c.setProfiles(profiles); // ignore inherited return c; diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java index 9b25df5306..c4c5a455aa 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Schema.java @@ -44,7 +44,6 @@ public SchemaMetadata getSchemaMetadata() { .filter(d -> d.value() != null) .collect(Collectors.toMap(Setting::key, Setting::value))); for (Table t : this.tables) { - if (s.getName() == null) s.setName(t.getSchemaName()); TableMetadata tm = s.create(table(t.getName())); tm.setInheritName(t.getInheritName()); tm.setSettings( diff --git a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java index a40a151a00..b8417fe489 100644 --- a/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java +++ b/backend/molgenis-emx2-graphql/src/main/java/org/molgenis/emx2/json/Table.java @@ -17,8 +17,6 @@ public class Table { private String inheritName; private List labels = new ArrayList<>(); private List descriptions = new ArrayList<>(); - private String schemaName; - private String schemaId; private Collection unique = new ArrayList<>(); private Collection columns = new ArrayList<>(); private List settings = new ArrayList<>(); @@ -41,6 +39,7 @@ public Table(TableMetadata tableMetadata, boolean minimal) { this.description = tableMetadata.getDescription(); this.labels = tableMetadata.getLabels().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.id = tableMetadata.getIdentifier(); @@ -52,6 +51,7 @@ public Table(TableMetadata tableMetadata, boolean minimal) { } this.descriptions = tableMetadata.getDescriptions().entrySet().stream() + .filter(entry -> entry.getValue() != null && entry.getValue().trim().length() > 0) .map(entry -> new LanguageValue(entry.getKey(), entry.getValue())) .toList(); this.semantics = tableMetadata.getSemantics(); @@ -59,8 +59,6 @@ public Table(TableMetadata tableMetadata, boolean minimal) { tableMetadata.getSettings().entrySet().stream() .map(entry -> new Setting(entry.getKey(), entry.getValue())) .toList(); - this.schemaName = tableMetadata.getSchemaName(); - this.schemaId = tableMetadata.getSchema().getName(); // todo? getIdentifier? for (org.molgenis.emx2.Column column : tableMetadata.getColumns()) { this.columns.add(new Column(column, tableMetadata, minimal)); } @@ -132,14 +130,6 @@ public void setSettings(List settings) { this.settings = settings; } - public String getSchemaName() { - return schemaName; - } - - public void setSchemaName(String schemaName) { - this.schemaName = schemaName; - } - public String[] getSemantics() { return semantics; } @@ -204,14 +194,6 @@ public void setDescription(String description) { this.description = description; } - public String getSchemaId() { - return schemaId; - } - - public void setSchemaId(String schemaId) { - this.schemaId = schemaId; - } - public String[] getProfiles() { return profiles; } diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java index ca27d09477..8d9c33f8cd 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlCrossSchemaRefs.java @@ -55,11 +55,7 @@ public void test() throws IOException { } @Test - void testCrossSchemaTablesAreInSchemaEndpoint() throws IOException { - String result = - execute("{_schema{tables{name,id,schemaName,schemaId}}}").at("/_schema").toString(); - assertTrue(result.contains(schemaName2)); - + void testThatSeemingSelfReferenceWorksFix4264() throws IOException { // test that seemingly self reference works // when table name in schema1 and schema2 have same name // test fix https://github.com/molgenis/molgenis-emx2/issues/4264 diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java index a006ca973c..cb28e258f6 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlDatabaseFields.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.molgenis.emx2.ColumnType.STRING; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import static org.molgenis.emx2.sql.SqlDatabase.ADMIN_PW_DEFAULT; diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java index 2468d76e61..da76a8685e 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestGraphqlSchemaFields.java @@ -6,7 +6,7 @@ import static org.molgenis.emx2.ColumnType.REF_ARRAY; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import static org.molgenis.emx2.sql.SqlDatabase.ANONYMOUS; import static org.molgenis.emx2.utils.TypeUtils.convertToCamelCase; @@ -24,6 +24,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.sql.TestDatabaseFactory; import org.molgenis.emx2.tasks.Task; import org.molgenis.emx2.tasks.TaskService; @@ -40,8 +41,25 @@ public class TestGraphqlSchemaFields { @BeforeAll public static void setup() { database = TestDatabaseFactory.getTestDatabase(); + final String shopviewer = "shopviewer"; + final String shopmanager = "shopmanager"; + final String shopowner = "shopowner"; + final String costumer = "costumer"; + + // initialize users + database.setUserPassword(shopmanager, shopmanager); + database.setUserPassword(shopviewer, shopviewer); + database.setUserPassword(shopowner, shopowner); + database.setUserPassword(costumer, costumer); + schema = database.dropCreateSchema(schemaName); - PET_STORE.getImportTask(schema, true).run(); + schema.addMember(shopmanager, "Manager"); + schema.addMember(shopviewer, "Viewer"); + schema.addMember(shopowner, "Owner"); + schema.addMember(costumer, "Range"); + DataModels.getImportTask(schema, PET_STORE.name(), true).run(); + schema = database.getSchema(schemaName); + taskService = new TaskServiceInMemory(); grapql = new GraphqlApiFactory().createGraphqlForSchema(schema, taskService); } diff --git a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java index e8e7e7fdb1..6d3f5939f8 100644 --- a/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java +++ b/backend/molgenis-emx2-graphql/src/test/java/org/molgenis/emx2/graphql/TestSumQuery.java @@ -7,8 +7,6 @@ import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.SelectColumn.s; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.PetStoreLoader.COLORS; -import static org.molgenis.emx2.datamodels.PetStoreLoader.TAG; import static org.molgenis.emx2.sql.SqlQuery.SUM_FIELD; import com.fasterxml.jackson.core.JsonProcessingException; @@ -22,6 +20,10 @@ import org.molgenis.emx2.sql.TestDatabaseFactory; public class TestSumQuery { + + public static final String TAG = "Tag"; + public static final String COLORS = "colors"; + private static final String TEST_SUM_QUERY = "TestSumQuery"; static Database database; static Schema schema; diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java index a3253d2b36..669960f578 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestColumnTypeIsFile.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; -import org.molgenis.emx2.datamodels.PetStoreLoader; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.io.tablestore.TableStore; import org.molgenis.emx2.io.tablestore.TableStoreForCsvFile; import org.molgenis.emx2.io.tablestore.TableStoreForXlsxFile; @@ -30,7 +30,7 @@ public class TestColumnTypeIsFile { public static void setup() { database = TestDatabaseFactory.getTestDatabase(); schema = database.dropCreateSchema(SCHEMA_NAME); - new PetStoreLoader(schema, false).run(); + DataModels.Profile.PET_STORE.getImportTask(schema, false).run(); schema .getTable("User") diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java index 6ef8aedc5f..3b5d00f5f6 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestImportExportAllExamples.java @@ -10,7 +10,6 @@ import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; -import org.molgenis.emx2.datamodels.PetStoreLoader; import org.molgenis.emx2.datamodels.test.ArrayTypeTestExample; import org.molgenis.emx2.datamodels.test.ProductComponentPartsExample; import org.molgenis.emx2.datamodels.test.RefAndRefArrayTestExample; @@ -59,13 +58,6 @@ public void testProductComponentPartsExample() throws IOException { executeCompare(schema1); } - @Test - public void testPetStoreExample() throws IOException { - SchemaMetadata schema1 = new SchemaMetadata(prefix + "7"); - schema1.create(PetStoreLoader.getSchemaMetadata().getTables().toArray(new TableMetadata[0])); - executeCompare(schema1); - } - @Test public void testDefaultValuesMetadata() throws IOException { SchemaMetadata schema1 = new SchemaMetadata(prefix + "8"); diff --git a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java index f4a0bf7f6d..3535b88545 100644 --- a/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java +++ b/backend/molgenis-emx2-io/src/test/java/org/molgenis/emx2/io/TestRenameAndDelete.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.IOException; import java.util.List; diff --git a/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java b/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java index c916a3e262..8ddfc7c761 100644 --- a/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java +++ b/backend/molgenis-emx2-nonparallel-tests/src/test/java/org/molgenis/emx2/graphql/TestGraphqlAggregatePermission.java @@ -4,7 +4,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.molgenis.emx2.Constants.ANONYMOUS; import static org.molgenis.emx2.Privileges.AGGREGATOR; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.graphql.GraphqlApiFactory.convertExecutionResultToJson; import com.fasterxml.jackson.databind.JsonNode; diff --git a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java index 61db49edc4..0438342ee9 100644 --- a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java +++ b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/OntologyTableSemantics.java @@ -1,7 +1,7 @@ package org.molgenis.emx2.rdf; import static org.junit.jupiter.api.Assertions.*; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.ByteArrayOutputStream; import java.io.InputStreamReader; diff --git a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java index dec3ecf5ea..4339b6c865 100644 --- a/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java +++ b/backend/molgenis-emx2-rdf/src/test/java/org/molgenis/emx2/rdf/RDFTest.java @@ -4,7 +4,6 @@ import static org.molgenis.emx2.Column.column; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; import java.io.ByteArrayOutputStream; import java.io.File; @@ -37,6 +36,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.molgenis.emx2.*; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.sql.TestDatabaseFactory; public class RDFTest { @@ -89,8 +89,8 @@ public static void setup() { database = TestDatabaseFactory.getTestDatabase(); petStore_nr1 = database.dropCreateSchema("petStoreNr1"); petStore_nr2 = database.dropCreateSchema("petStoreNr2"); - PET_STORE.getImportTask(petStore_nr1, true).run(); - PET_STORE.getImportTask(petStore_nr2, true).run(); + DataModels.Profile.PET_STORE.getImportTask(petStore_nr1, false).run(); + DataModels.Profile.PET_STORE.getImportTask(petStore_nr2, false).run(); petStoreSchemas = List.of(petStore_nr1, petStore_nr2); // Test schema for composite keys diff --git a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java index 6376c7dbb9..44d5cb27c3 100644 --- a/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java +++ b/backend/molgenis-emx2-sql/src/main/java/org/molgenis/emx2/sql/SqlSchema.java @@ -183,60 +183,16 @@ public void tx(Transaction transaction) { @Override public void discard(SchemaMetadata discardSchema) { - // check if all tables and columns are known - List errors = new ArrayList<>(); - for (TableMetadata discardTable : discardSchema.getTables()) { - TableMetadata existingTable = getMetadata().getTableMetadata(discardTable.getTableName()); - if (existingTable == null) { - errors.add("Table '" + discardTable.getTableName() + " not found"); - } else { - for (String discardColumn : discardTable.getLocalColumnNames()) { - if (!existingTable.getLocalColumnNames().contains(discardColumn)) - errors.add( - "Column '" + discardTable.getTableName() + "." + discardColumn + " not found"); - } - } - } - if (!errors.isEmpty()) { - throw new MolgenisException( - "Discard failed: Discard of tables out of schema " - + getMetadata().getName() - + " failed: " - + String.join("\n", errors)); - } - - // get all tables, sorted and use that as scaffold - tx(db -> discardTransaction((SqlDatabase) db, discardSchema.getName())); - this.getDatabase().getListener().schemaChanged(this.getName()); - } - - private static void discardTransaction(SqlDatabase db, String schemaName) { - Schema schema = db.getSchema(schemaName); - SchemaMetadata schemaMetadata = db.getSchema(schemaName).getMetadata(); - List tables = schemaMetadata.getTables(); - Collections.reverse(tables); - - // remove whole tables unless columns attached - for (TableMetadata existingTable : tables) { - // if no coluns then we delete whole table - if (schemaMetadata.getTableMetadata(existingTable.getTableName()) != null) { - TableMetadata discardTable = schemaMetadata.getTableMetadata(existingTable.getTableName()); - if (discardTable.getLocalColumnNames().isEmpty() - || discardTable - .getLocalColumnNames() - .containsAll(existingTable.getLocalColumnNames())) { - schema.dropTable(existingTable.getTableName()); - MetadataUtils.deleteTable(db.getJooq(), existingTable); - } else { - // or column names - for (String discardColumn : discardTable.getLocalColumnNames()) { - Column existingColumn = existingTable.getColumn(discardColumn); - existingTable.dropColumn(discardColumn); - MetadataUtils.deleteColumn(db.getJooq(), existingColumn); - } - } - } - } + // use migrate + SchemaMetadata mergeSchema = new SchemaMetadata(discardSchema); + mergeSchema + .getTables() + .forEach( + t -> { + t.drop(); + t.getColumns().forEach(c -> c.drop()); + }); + migrate(mergeSchema); } @Override diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java index 5ac5eb2a2a..a6956ad461 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestAggregatePermission.java @@ -4,7 +4,7 @@ import static org.molgenis.emx2.Constants.ANONYMOUS; import static org.molgenis.emx2.Privileges.AGGREGATOR; import static org.molgenis.emx2.SelectColumn.s; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.sql.SqlQuery.*; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java index 62a7b209a1..279b2ee2b8 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestFullTextSearch.java @@ -8,7 +8,7 @@ import static org.molgenis.emx2.FilterBean.f; import static org.molgenis.emx2.FilterBean.or; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.util.List; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java index 4e3a1516ab..6eca12a7ff 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestQueryJsonGraph.java @@ -9,7 +9,7 @@ import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.SelectColumn.s; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java index f4883b32fb..b0e1a6277a 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestSqlRawQueryForSchema.java @@ -1,7 +1,7 @@ package org.molgenis.emx2.sql; import static org.junit.jupiter.api.Assertions.*; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.util.List; import java.util.Map; diff --git a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java index 07634d8b40..4389dbcfbd 100644 --- a/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java +++ b/backend/molgenis-emx2-sql/src/test/java/org/molgenis/emx2/sql/TestValidation.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.fail; import static org.molgenis.emx2.Row.row; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import java.io.IOException; import org.junit.jupiter.api.BeforeAll; diff --git a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java index 2d0fb2901f..356a272128 100644 --- a/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java +++ b/backend/molgenis-emx2-typescript/src/test/java/org/molgenis/emx2/typescript/GeneratorTest.java @@ -10,7 +10,7 @@ import org.junit.jupiter.api.Test; import org.molgenis.emx2.Database; import org.molgenis.emx2.Schema; -import org.molgenis.emx2.datamodels.PetStoreLoader; +import org.molgenis.emx2.datamodels.DataModels; import org.molgenis.emx2.datamodels.test.ProductComponentPartsExample; import org.molgenis.emx2.datamodels.test.SimpleTypeTestExample; import org.molgenis.emx2.sql.TestDatabaseFactory; @@ -30,8 +30,7 @@ void generateTypes() throws IOException { File f = new File(this.getClass().getClassLoader().getResource("generateTypes.ts").getFile()); Schema schema = db.dropCreateSchema(GeneratorTest.class.getSimpleName() + "-PetStore"); - PetStoreLoader petStoreLoader = new PetStoreLoader(schema, false); - petStoreLoader.run(); + DataModels.Profile.PET_STORE.getImportTask(schema, false).run(); new Generator().generate(schema, f.getPath()); // now compare generated with expected diff --git a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java index fed59f427a..f22006a511 100644 --- a/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java +++ b/backend/molgenis-emx2-webapi/src/main/java/org/molgenis/emx2/RunMolgenisEmx2.java @@ -5,7 +5,6 @@ import org.molgenis.emx2.datamodels.BiobankDirectoryLoader; import org.molgenis.emx2.datamodels.DataModels; -import org.molgenis.emx2.datamodels.PetStoreLoader; import org.molgenis.emx2.sql.SqlDatabase; import org.molgenis.emx2.utils.EnvironmentProperty; import org.molgenis.emx2.web.MolgenisWebservice; @@ -31,8 +30,18 @@ public class RunMolgenisEmx2 { public static void main(String[] args) { logger.info("Starting MOLGENIS EMX2 Software Version=" + Version.getVersion()); - Integer port = - (Integer) EnvironmentProperty.getParameter(Constants.MOLGENIS_HTTP_PORT, "8080", INT); + Integer port = 8080; + if (args.length >= 1) { + try { + port = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + logger.error("Port number should be an integer, but was: " + args[0]); + System.exit(1); + } + } else { + port = (Integer) EnvironmentProperty.getParameter(Constants.MOLGENIS_HTTP_PORT, "8080", INT); + } + logger.info( "with " + org.molgenis.emx2.Constants.MOLGENIS_HTTP_PORT @@ -50,7 +59,7 @@ public static void main(String[] args) { if (!EXCLUDE_PETSTORE_DEMO && db.getSchema("pet store") == null) { Schema schema = db.createSchema("pet store"); - new PetStoreLoader(schema, true).run(); + DataModels.Profile.PET_STORE.getImportTask(schema, true).run(); } if (INCLUDE_CATALOGUE_DEMO && db.getSchema(CATALOGUE_DEMO) == null) { diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java index d8e9a3776a..06a269a5c6 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/RunWebApi.java @@ -1,6 +1,6 @@ package org.molgenis.emx2.web; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import com.zaxxer.hikari.HikariDataSource; import java.io.IOException; diff --git a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java index d6682e4f90..4264a5496a 100644 --- a/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java +++ b/backend/molgenis-emx2-webapi/src/test/java/org.molgenis.emx2.web/WebApiSmokeTests.java @@ -1,6 +1,5 @@ package org.molgenis.emx2.web; -import static com.github.stefanbirkner.systemlambda.SystemLambda.withEnvironmentVariable; import static io.restassured.RestAssured.given; import static io.restassured.RestAssured.when; import static org.hamcrest.CoreMatchers.equalTo; @@ -8,13 +7,12 @@ import static org.junit.jupiter.api.Assertions.*; import static org.molgenis.emx2.Column.column; import static org.molgenis.emx2.ColumnType.STRING; -import static org.molgenis.emx2.Constants.MOLGENIS_HTTP_PORT; import static org.molgenis.emx2.Constants.SYSTEM_SCHEMA; import static org.molgenis.emx2.FilterBean.f; import static org.molgenis.emx2.Operator.EQUALS; import static org.molgenis.emx2.Row.row; import static org.molgenis.emx2.TableMetadata.table; -import static org.molgenis.emx2.datamodels.DataModels.Regular.PET_STORE; +import static org.molgenis.emx2.datamodels.DataModels.Profile.PET_STORE; import static org.molgenis.emx2.sql.SqlDatabase.ADMIN_PW_DEFAULT; import static org.molgenis.emx2.sql.SqlDatabase.ANONYMOUS; import static org.molgenis.emx2.web.Constants.*; @@ -48,6 +46,8 @@ public class WebApiSmokeTests { public static final String DATA_PET_STORE = "/pet store/api/csv"; public static final String PET_SHOP_OWNER = "pet_shop_owner"; + public static final String PET_SHOP_VIEWER = "shopviewer"; + public static final String PET_SHOP_MANAGER = "shopmanager"; public static final String SYSTEM_PREFIX = "/" + SYSTEM_SCHEMA; public static final String TABLE_WITH_SPACES = "table with spaces"; public static final String PET_STORE_SCHEMA = "pet store"; @@ -64,9 +64,7 @@ public static void before() throws Exception { db = TestDatabaseFactory.getTestDatabase(); // start web service for testing, including env variables - withEnvironmentVariable(MOLGENIS_HTTP_PORT, "" + PORT) - // disable because of parallelism issues .and(MOLGENIS_INCLUDE_CATALOGUE_DEMO, "true") - .execute(() -> RunMolgenisEmx2.main(new String[] {})); + RunMolgenisEmx2.main(new String[] {String.valueOf(PORT)}); // set default rest assured settings RestAssured.port = PORT; @@ -95,6 +93,11 @@ public static void before() throws Exception { PET_STORE.getImportTask(schema, true).run(); // grant a user permission + db.setUserPassword(PET_SHOP_OWNER, PET_SHOP_OWNER); + db.setUserPassword(PET_SHOP_VIEWER, PET_SHOP_VIEWER); + db.setUserPassword(PET_SHOP_MANAGER, PET_SHOP_MANAGER); + schema.addMember(PET_SHOP_MANAGER, Privileges.MANAGER.toString()); + schema.addMember(PET_SHOP_VIEWER, Privileges.VIEWER.toString()); schema.addMember(PET_SHOP_OWNER, Privileges.OWNER.toString()); schema.addMember(ANONYMOUS, Privileges.VIEWER.toString()); db.grantCreateSchema(PET_SHOP_OWNER); diff --git a/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java b/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java index 93fc64c9ab..35a75c798c 100644 --- a/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java +++ b/backend/molgenis-emx2/src/main/java/org/molgenis/emx2/HasLabelsDescriptionsAndSettings.java @@ -29,9 +29,6 @@ public T setLabel(String label) { public T setLabel(String label, String locale) { Objects.requireNonNull(locale); - if (label == null || label.trim().equals("")) { - this.labels.remove(locale); - } this.labels.put(locale, label); return (T) this; } diff --git a/data/_demodata/applications/petstore/Category.csv b/data/_demodata/applications/petstore/Category.csv new file mode 100644 index 0000000000..f99c56fd80 --- /dev/null +++ b/data/_demodata/applications/petstore/Category.csv @@ -0,0 +1,7 @@ +name +cat +dog +mouse +bird +ant +caterpillar \ No newline at end of file diff --git a/data/_demodata/applications/petstore/Order.csv b/data/_demodata/applications/petstore/Order.csv new file mode 100644 index 0000000000..fac070e2e8 --- /dev/null +++ b/data/_demodata/applications/petstore/Order.csv @@ -0,0 +1,3 @@ +orderId,pet,quantity,price,complete,status +ORDER:6fe7a528-2e97-48cc-91e6-a94c689b4919,pooky,1,9.99,true,delivered +ORDER:e27c852c-29e2-4459-bcf1-98d8907ff77b,spike,7,14.99,false,approved \ No newline at end of file diff --git a/data/_demodata/applications/petstore/Pet.csv b/data/_demodata/applications/petstore/Pet.csv new file mode 100644 index 0000000000..59a85876c9 --- /dev/null +++ b/data/_demodata/applications/petstore/Pet.csv @@ -0,0 +1,9 @@ +name,category,photoUrls,status,tags,weight +pooky,cat,,available,,9.4 +spike,dog,,sold,"red,green",15.7 +tom,cat,,available,red,3.14 +sylvester,cat,,available,purple,1.337 +jerry,mouse,,available,blue,0.18 +tweety,bird,,available,red,0.1 +the very hungry caterpillar,caterpillar,,available,green,0.5 +fire ant,ant,,available,"purple,red,green",0.01 diff --git a/data/_demodata/applications/petstore/User.csv b/data/_demodata/applications/petstore/User.csv new file mode 100644 index 0000000000..97895294fb --- /dev/null +++ b/data/_demodata/applications/petstore/User.csv @@ -0,0 +1,2 @@ +username,firstName,lastName,picture,picture_filename,email,password,phone,userStatus,pets +bofke,"",,65c0628c9e94414d877e4a51cf5dc3ac,8hlbnm.jpg,,,,,"pooky,spike,the very hungry caterpillar,fire ant" \ No newline at end of file diff --git a/data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg b/data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg new file mode 100644 index 0000000000..7d078be145 Binary files /dev/null and b/data/_demodata/applications/petstore/_files/65c0628c9e94414d877e4a51cf5dc3ac.jpg differ diff --git a/data/_models/specific/petstore.csv b/data/_models/specific/petstore.csv new file mode 100644 index 0000000000..984ee58474 --- /dev/null +++ b/data/_models/specific/petstore.csv @@ -0,0 +1,30 @@ +tableName,tableExtends,tableType,columnName,columnType,key,required,refSchema,refTable,refLink,refBack,refLabel,defaultValue,validation,visible,computed,semantics,profiles,label,description +Pet,,,,,,,,,,,,,,,,,Petstore,,My pet store example table +Order,,,,,,,,,,,,,,,,,Petstore,, +User,,,,,,,,,,,,,,,,,Petstore,, +Category,,,,,,,,,,,,,,,,,Petstore,, +Category,,,name,,1,true,,,,,,,,,,,Petstore,, +Order,,,orderId,auto_id,1,true,,,,,,,,,ORDER:${mg_autoid},,Petstore,, +Order,,,pet,ref,,,,Pet,,,,,,,,,Petstore,, +Order,,,quantity,long,,,,,,,,,if(quantity < 1) 'quantity should be >= 1',,,,Petstore,, +Order,,,price,decimal,,,,,,,,,price >= 1,,,,Petstore,, +Order,,,complete,bool,,,,,,,,,,,,,Petstore,, +Order,,,status,,,,,,,,,hallo,,,,,Petstore,, +Pet,,,name,,1,true,,,,,,,,,,,Petstore,,the name +Pet,,,category,ref,,true,,Category,,,,,,,,,Petstore,, +Pet,,,photoUrls,string_array,,,,,,,,,,,,,Petstore,, +Pet,,,details,heading,,,,,,,,,,,,,Petstore,,Details +Pet,,,status,,,,,,,,,,,,,,Petstore,, +Pet,,,tags,ontology_array,,,,Tag,,,,,,,,,Petstore,, +Pet,,,weight,decimal,,true,,,,,,,,,,,Petstore,, +Pet,,,Heading2,heading,,,,,,,,,,,,,Petstore,, +Pet,,,orders,refback,,,,Order,,pet,,,,,,,Petstore,, +User,,,username,,1,true,,,,,,,,,,,Petstore,, +User,,,firstName,,,,,,,,,,,,,,Petstore,, +User,,,lastName,,,,,,,,,,,,,,Petstore,, +User,,,picture,file,,,,,,,,,,,,,Petstore,, +User,,,email,email,,,,,,,,,,,,,Petstore,, +User,,,password,,,,,,,,,,,,,,Petstore,, +User,,,phone,,,,,,,,,,,,,,Petstore,, +User,,,userStatus,int,,,,,,,,,,,,,Petstore,, +User,,,pets,ref_array,,,,Pet,,,,,,,,,Petstore,, \ No newline at end of file diff --git a/data/_ontologies/Tag.csv b/data/_ontologies/Tag.csv new file mode 100644 index 0000000000..8be6181acf --- /dev/null +++ b/data/_ontologies/Tag.csv @@ -0,0 +1,12 @@ +order,name,label,parent,codesystem,code,ontologyTermURI,definition +,colors,,,,,, +,red,,colors,,,, +,green,,colors,,,, +,blue,,colors,,,, +,purple,,colors,,,, +,species,,,,,, +,mammals,,species,,,, +,carnivorous mammals,,mammals,,,, +,herbivorous mammals,,mammals,,,, +,birds,,species,,,, +,insect,,species,,,, \ No newline at end of file diff --git a/data/_profiles/PetStore.yaml b/data/_profiles/PetStore.yaml new file mode 100644 index 0000000000..dabe432588 --- /dev/null +++ b/data/_profiles/PetStore.yaml @@ -0,0 +1,12 @@ +--- +name: Pet store +description: "a demo schema" + +profileTags: Petstore + +demoData: _demodata/applications/petstore + +settings: _settings/petstore + +# special options +setViewPermission: anonymous \ No newline at end of file diff --git a/data/_settings/petstore/molgenis_members.csv b/data/_settings/petstore/molgenis_members.csv new file mode 100644 index 0000000000..7032c4467e --- /dev/null +++ b/data/_settings/petstore/molgenis_members.csv @@ -0,0 +1,6 @@ +user,role +anonymous,Viewer +costumer,Range +shopmanager,Manager +shopowner,Owner +shopviewer,Viewer \ No newline at end of file diff --git a/data/_settings/petstore/molgenis_settings.csv b/data/_settings/petstore/molgenis_settings.csv new file mode 100644 index 0000000000..fb1d8a6d2f --- /dev/null +++ b/data/_settings/petstore/molgenis_settings.csv @@ -0,0 +1,2 @@ +table,key,value +,reports,"[{""id"":""report1"",""description"":""pet report"",""sql"":""select * from \""Pet\""""},{""id"":""report2"",""description"":""pet report with parameters"",""sql"":""select * from \""Pet\"" p where p.name=ANY(${name:string_array})""},{""id"":""report3"",""description"":""jsonb"",""sql"":""SELECT jsonb_agg(to_jsonb(\""Pet\"")) AS result FROM \""Pet\""""},{""id"":""report4"",""description"":""jsonb rows"",""sql"":""SELECT to_jsonb(\""Pet\"") AS result FROM \""Pet\""""}]" diff --git a/e2e/tests/tailwind-components/form/renderForm.spec.ts b/e2e/tests/tailwind-components/form/renderForm.spec.ts index 0b4fc93199..d97491a3b4 100644 --- a/e2e/tests/tailwind-components/form/renderForm.spec.ts +++ b/e2e/tests/tailwind-components/form/renderForm.spec.ts @@ -13,5 +13,5 @@ test("it should update the model value when a field is filled out", async ({ pag await page.goto(`${route}Form.story`); await page.getByLabel('name').click(); await page.getByLabel('name').fill('test'); - await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "details": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": "" } errorMap: { "name": [], "category": [], "photoUrls": [], "details": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); + await expect(page.getByRole('main')).toContainText('dataMap: { "name": "test", "category": "", "photoUrls": "", "status": "", "tags": "", "weight": "", "orders": "", "mg_draft": "", "mg_insertedBy": "", "mg_insertedOn": "", "mg_updatedBy": "", "mg_updatedOn": "" } errorMap: { "name": [], "category": [], "photoUrls": [], "status": [], "tags": [], "weight": [], "orders": [], "mg_draft": [], "mg_insertedBy": [], "mg_insertedOn": [], "mg_updatedBy": [], "mg_updatedOn": [] }'); }); \ No newline at end of file