diff --git a/migrations/20181226_productTemplates_subCategory.sql b/migrations/20181226_productTemplates_subCategory.sql new file mode 100644 index 00000000..8626b0e2 --- /dev/null +++ b/migrations/20181226_productTemplates_subCategory.sql @@ -0,0 +1,14 @@ +-- +-- UPDATE EXISTING TABLES: +-- product_templates: +-- added column `subCategory` + +-- +-- product_templates + +-- Add new column +ALTER TABLE product_templates ADD COLUMN "subCategory" character varying(45); +-- Update new column +UPDATE product_templates SET "subCategory"="category" WHERE "subCategory" is NULL; +-- Set not null +ALTER TABLE product_templates ALTER COLUMN "subCategory" SET NOT NULL; diff --git a/src/models/productTemplate.js b/src/models/productTemplate.js index 4e4dc184..f8fd7f17 100644 --- a/src/models/productTemplate.js +++ b/src/models/productTemplate.js @@ -9,6 +9,7 @@ module.exports = (sequelize, DataTypes) => { name: { type: DataTypes.STRING(255), allowNull: false }, productKey: { type: DataTypes.STRING(45), allowNull: false }, category: { type: DataTypes.STRING(45), allowNull: false }, + subCategory: { type: DataTypes.STRING(45), allowNull: false }, icon: { type: DataTypes.STRING(255), allowNull: false }, brief: { type: DataTypes.STRING(45), allowNull: false }, details: { type: DataTypes.STRING(255), allowNull: false }, diff --git a/src/routes/metadata/list.spec.js b/src/routes/metadata/list.spec.js index 7e7c9b4f..86798d21 100644 --- a/src/routes/metadata/list.spec.js +++ b/src/routes/metadata/list.spec.js @@ -30,6 +30,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/milestoneTemplates/clone.spec.js b/src/routes/milestoneTemplates/clone.spec.js index 03ad322a..a0f9bbbd 100644 --- a/src/routes/milestoneTemplates/clone.spec.js +++ b/src/routes/milestoneTemplates/clone.spec.js @@ -14,6 +14,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -47,6 +48,7 @@ const productTemplates = [ name: 'name 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/milestoneTemplates/create.spec.js b/src/routes/milestoneTemplates/create.spec.js index 00dad710..beacf71f 100644 --- a/src/routes/milestoneTemplates/create.spec.js +++ b/src/routes/milestoneTemplates/create.spec.js @@ -15,6 +15,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -48,6 +49,7 @@ const productTemplates = [ name: 'template 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/milestoneTemplates/delete.spec.js b/src/routes/milestoneTemplates/delete.spec.js index 0d0d5527..92a6dcb6 100644 --- a/src/routes/milestoneTemplates/delete.spec.js +++ b/src/routes/milestoneTemplates/delete.spec.js @@ -40,6 +40,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -73,6 +74,7 @@ const productTemplates = [ name: 'template 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/milestoneTemplates/get.spec.js b/src/routes/milestoneTemplates/get.spec.js index 58ce6a5a..50f31370 100644 --- a/src/routes/milestoneTemplates/get.spec.js +++ b/src/routes/milestoneTemplates/get.spec.js @@ -15,6 +15,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -48,6 +49,7 @@ const productTemplates = [ name: 'template 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/milestoneTemplates/list.spec.js b/src/routes/milestoneTemplates/list.spec.js index 2ee2f25f..465a388f 100644 --- a/src/routes/milestoneTemplates/list.spec.js +++ b/src/routes/milestoneTemplates/list.spec.js @@ -15,6 +15,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -48,6 +49,7 @@ const productTemplates = [ name: 'template 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/milestoneTemplates/update.spec.js b/src/routes/milestoneTemplates/update.spec.js index 68be6f31..3de8c430 100644 --- a/src/routes/milestoneTemplates/update.spec.js +++ b/src/routes/milestoneTemplates/update.spec.js @@ -15,6 +15,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -48,6 +49,7 @@ const productTemplates = [ name: 'template 2', productKey: 'productKey 2', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/phases/create.spec.js b/src/routes/phases/create.spec.js index 8bdcb5d8..69f45a4d 100644 --- a/src/routes/phases/create.spec.js +++ b/src/routes/phases/create.spec.js @@ -97,6 +97,7 @@ describe('Project Phases', () => { name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/productTemplates/create.js b/src/routes/productTemplates/create.js index 8f47ec4f..9907d085 100644 --- a/src/routes/productTemplates/create.js +++ b/src/routes/productTemplates/create.js @@ -16,6 +16,7 @@ const schema = { param: Joi.object().keys({ id: Joi.any().strip(), category: Joi.string().max(45).required(), + subCategory: Joi.string().max(45).required(), name: Joi.string().max(255).required(), productKey: Joi.string().max(45).required(), icon: Joi.string().max(255).required(), diff --git a/src/routes/productTemplates/create.spec.js b/src/routes/productTemplates/create.spec.js index b4da9239..0c283caf 100644 --- a/src/routes/productTemplates/create.spec.js +++ b/src/routes/productTemplates/create.spec.js @@ -35,6 +35,7 @@ describe('CREATE product template', () => { name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/productTemplates/delete.spec.js b/src/routes/productTemplates/delete.spec.js index edb53d74..5c4d177c 100644 --- a/src/routes/productTemplates/delete.spec.js +++ b/src/routes/productTemplates/delete.spec.js @@ -43,6 +43,7 @@ describe('DELETE product template', () => { name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/productTemplates/get.spec.js b/src/routes/productTemplates/get.spec.js index 42b34e30..fd7cd7da 100644 --- a/src/routes/productTemplates/get.spec.js +++ b/src/routes/productTemplates/get.spec.js @@ -15,6 +15,7 @@ describe('GET product template', () => { name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/productTemplates/list.spec.js b/src/routes/productTemplates/list.spec.js index 9282e409..a9386f66 100644 --- a/src/routes/productTemplates/list.spec.js +++ b/src/routes/productTemplates/list.spec.js @@ -14,12 +14,13 @@ import testUtil from '../../tests/util'; const validateProductTemplates = (count, resJson, expectedTemplates) => { resJson.should.have.length(count); resJson.forEach((pt, idx) => { - pt.should.have.all.keys('id', 'name', 'productKey', 'category', 'icon', 'brief', 'details', 'aliases', - 'template', 'disabled', 'hidden', 'createdBy', 'createdAt', 'updatedBy', 'updatedAt'); + pt.should.have.all.keys('id', 'name', 'productKey', 'category', 'subCategory', 'icon', 'brief', 'details', + 'aliases', 'template', 'disabled', 'hidden', 'createdBy', 'createdAt', 'updatedBy', 'updatedAt'); pt.should.not.have.all.keys('deletedAt', 'deletedBy'); pt.name.should.be.eql(expectedTemplates[idx].name); pt.productKey.should.be.eql(expectedTemplates[idx].productKey); pt.category.should.be.eql(expectedTemplates[idx].category); + pt.subCategory.should.be.eql(expectedTemplates[idx].subCategory); pt.icon.should.be.eql(expectedTemplates[idx].icon); pt.brief.should.be.eql(expectedTemplates[idx].brief); pt.details.should.be.eql(expectedTemplates[idx].details); @@ -38,6 +39,7 @@ describe('LIST product templates', () => { name: 'name 1', productKey: 'productKey-1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', @@ -73,6 +75,7 @@ describe('LIST product templates', () => { name: 'template 2', productKey: 'productKey-2', category: 'concrete', + subCategory: 'concrete', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', diff --git a/src/routes/productTemplates/update.spec.js b/src/routes/productTemplates/update.spec.js index 6e65461d..0aeedaf6 100644 --- a/src/routes/productTemplates/update.spec.js +++ b/src/routes/productTemplates/update.spec.js @@ -15,6 +15,7 @@ describe('UPDATE product template', () => { name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/projectUpgrade/create.spec.js b/src/routes/projectUpgrade/create.spec.js index 41ee7e0b..9ab136e0 100644 --- a/src/routes/projectUpgrade/create.spec.js +++ b/src/routes/projectUpgrade/create.spec.js @@ -95,6 +95,7 @@ describe('Project upgrade', () => { name: 'name 1', productKey: 'a product key', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/routes/projects/create.spec.js b/src/routes/projects/create.spec.js index 5810401e..e8807e38 100644 --- a/src/routes/projects/create.spec.js +++ b/src/routes/projects/create.spec.js @@ -38,6 +38,7 @@ describe('Project create', () => { name: 'template 1', productKey: 'productKey-1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon2.ico', brief: 'brief 1', details: 'details 1', @@ -51,6 +52,7 @@ describe('Project create', () => { name: 'template 2', productKey: 'productKey-2', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon2.ico', brief: 'brief 2', details: 'details 2', @@ -64,6 +66,7 @@ describe('Project create', () => { name: 'template 3', productKey: 'productKey-3', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon3.ico', brief: 'brief 3', details: 'details 3', diff --git a/src/routes/timelines/create.spec.js b/src/routes/timelines/create.spec.js index 41590c37..20c88ed8 100644 --- a/src/routes/timelines/create.spec.js +++ b/src/routes/timelines/create.spec.js @@ -45,6 +45,7 @@ const productTemplates = [ name: 'name 1', productKey: 'productKey 1', category: 'generic', + subCategory: 'generic', icon: 'http://example.com/icon1.ico', brief: 'brief 1', details: 'details 1', diff --git a/src/tests/seed.js b/src/tests/seed.js index 5c4f553d..8790ad96 100644 --- a/src/tests/seed.js +++ b/src/tests/seed.js @@ -326,6 +326,7 @@ models.sequelize.sync({ force: true }) name: 'name 1', productKey: 'productKey 1', category: 'category', + subCategory: 'category', icon: 'http://example.com/icon1.ico', question: 'question 1', info: 'info 1',