Update sequelize & DB setup:

- Split models & associations into their own files
- Update columns and requirements
- Create PermissionLevel model & add to relevant models
This commit is contained in:
Robbie Antenesse 2020-01-14 15:26:39 -07:00
parent 86897be78a
commit 071e1e6586
22 changed files with 682 additions and 416 deletions

View File

@ -102,5 +102,5 @@ fastify.listen(fastify.siteConfig.port, function (err, address) {
} }
fastify.decorate('canEmail', typeof fastify.nodemailer !== 'undefined'); fastify.decorate('canEmail', typeof fastify.nodemailer !== 'undefined');
fastify.decorate('models', require('./sequelize/getModels')(fastify.sequelize)); fastify.decorate('models', require('./sequelize/models')(fastify.sequelize));
}); });

View File

@ -0,0 +1,10 @@
module.exports = models => {
const {
BookReference,
Review,
} = models;
BookReference.hasMany(Review);
return BookReference;
}

View File

@ -0,0 +1,23 @@
module.exports = models => {
const {
Recommendation,
User,
BookReference,
} = models;
Recommendation.belongsTo(User, {
foreignKey: 'fromUser',
onDelete: 'SET NULL',
});
Recommendation.belongsTo(User, {
foreignKey: 'toUser',
onDelete: 'CASCADE',
});
Recommendation.belongsTo(BookReference, {
foreignKey: 'bookId',
onDelete: 'CASCADE',
});
return Recommendation;
}

View File

@ -0,0 +1,25 @@
module.exports = models => {
const {
Review,
User,
PermissionLevel,
BookReference,
} = models;
Review.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
Review.belongsTo(PermissionLevel, {
foreignKey: 'permissionLevel',
onDelete: 'SET NULL',
});
Review.belongsTo(BookReference, {
foreignKey: 'bookReferenceId',
onDelete: 'SET NULL',
});
return Review;
}

View File

@ -0,0 +1,27 @@
module.exports = models => {
const {
Shelf,
User,
ShelfItem,
PermissionLevel,
} = models;
Shelf.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
Shelf.belongsTo(PermissionLevel, {
foreignKey: 'permissionLevel',
onDelete: 'SET NULL',
});
Shelf.belongsTo(User, {
foreignKey: 'permissionLevel',
onDelete: 'CASCADE',
});
Shelf.hasMany(ShelfItem);
return Shelf;
}

View File

@ -0,0 +1,22 @@
module.exports = models => {
const {
ShelfItem,
Shelf,
BookReference,
Status,
} = models;
ShelfItem.belongsTo(Shelf, {
foreignKey: 'shelfId',
onDelete: 'CASCADE',
});
ShelfItem.belongsTo(BookReference, {
foreignKey: 'bookId',
onDelete: 'CASCADE',
});
ShelfItem.hasMany(Status);
return ShelfItem;
}

View File

@ -0,0 +1,24 @@
module.exports = models => {
const {
Status,
User,
ShelfItem,
} = models;
Status.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
Status.belongsTo(PermissionLevel, {
foreignKey: 'permissionLevel',
onDelete: 'SET NULL',
});
Status.belongsTo(ShelfItem, {
foreignKey: 'shelfItemId',
onDelete: 'SET NULL',
});
return Status;
}

View File

@ -0,0 +1,23 @@
module.exports = models => {
const {
User,
PermissionLevel,
Shelf,
Status,
Review,
Recommendation,
} = models;
User.belongsTo(PermissionLevel, {
foreignKey: 'permissionLevel',
onDelete: 'SET NULL',
});
User.hasMany(Shelf);
User.hasMany(Status);
User.hasMany(Review);
User.hasMany(Recommendation, {
foreignKey: 'toUser',
});
return User;
}

View File

@ -0,0 +1,17 @@
const path = require('path');
const fs = require('fs');
module.exports = models => {
const associatedModels = {};
Object.keys(models).forEach(modelName => {
const associationFileName = path.resolve(__dirname, modelName, '.js');
if (fs.existsSync(associationFileName)) {
associatedModels[modelName] = require(associationFileName)(models);
} else {
associatedModels[modelName] = models[modelName];
}
});
return associatedModels;
};

View File

@ -1,392 +0,0 @@
const Sequelize = require('sequelize');
function getModels (sequelize) {
const User = sequelize.define('user', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
len: [5, 150],
},
},
username: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
is: /^[a-z0-9_]+$/i, // Is a set of characters a-z, 0-9, or _, case insensitive
len: [2, 32],
},
},
displayName: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
len: [1, 32],
},
},
passwordHash: {
type: Sequelize.STRING,
allowNull: false,
},
passwordSalt: {
type: Sequelize.STRING,
allowNull: false,
},
accountConfirm: {
type: Sequelize.STRING,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
const Shelf = sequelize.define('shelf', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
len: [1, 32],
},
},
isPublic: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: false,
},
isDeletable: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
Shelf.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
User.hasMany(Shelf);
const BookReference = sequelize.define('bookReference', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
description: {
type: Sequelize.STRING,
allowNull: false,
comment: 'The description is attempted to be made up of the type of work and the author',
},
sources: {
type: Sequelize.JSON,
allowNull: true,
defaultValue: [],
comment: 'A JSON array with each element being an object with named source <STRING> and source id <STRING>',
},
covers: {
type: Sequelize.JSON,
allowNull: true,
defaultValue: [],
comment: 'A JSON array with each element being an object with image url <STRING> and source id <STRING>',
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
indexes: [
{
fields: ['name', 'description'],
},
],
});
const ShelfItem = sequelize.define('shelfItem', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
shelfId: {
type: Sequelize.INTEGER,
references: {
model: Shelf,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
bookId: {
type: Sequelize.INTEGER,
references: {
model: BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
bookEdition: {
type: Sequelize.JSON,
allowNull: true,
comment: 'An object with properties `source` and `id`',
},
order: {
type: Sequelize.INTEGER,
defaultValue: 0,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
Shelf.hasMany(ShelfItem);
ShelfItem.belongsTo(Shelf, {
foreignKey: 'shelfId',
onDelete: 'CASCADE',
});
ShelfItem.belongsTo(BookReference, {
foreignKey: 'bookId',
onDelete: 'CASCADE',
});
const Status = sequelize.define('status', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
text: {
type: Sequelize.TEXT,
allowNull: true,
},
shelfItemId: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: ShelfItem,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
progress: {
type: Sequelize.INTEGER,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
User.hasMany(Status);
Status.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
ShelfItem.hasMany(Status);
Status.belongsTo(ShelfItem, {
foreignKey: 'shelfItemId',
// onDelete: 'IGNORE'
});
const Review = sequelize.define('review', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
references: {
model: User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
text: {
type: Sequelize.TEXT,
allowNull: true,
},
bookReferenceId: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
rating: {
type: Sequelize.INTEGER,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
User.hasMany(Review);
Review.belongsTo(User, {
foreignKey: 'userId',
onDelete: 'CASCADE',
});
BookReference.hasMany(Review);
Review.belongsTo(BookReference, {
foreignKey: 'shelfItemId',
// onDelete: 'IGNORE'
});
const Recommendation = sequelize.define('recommendation', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
toUser: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
text: {
type: Sequelize.TEXT,
allowNull: false,
},
book: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
data: {
type: Sequelize.JSON,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});
Recommendation.belongsTo(User, {
foreignKey: 'fromUser',
onDelete: 'SET NULL',
});
Recommendation.belongsTo(User, {
foreignKey: 'toUser',
onDelete: 'CASCADE',
});
User.hasMany(Recommendation, {
foreignKey: 'toUser',
})
return {
User,
Shelf,
BookReference,
ShelfItem,
StatusType,
Status,
Review,
Recommendation,
}
}
module.exports = getModels;

View File

@ -4,6 +4,7 @@ const fs = require('fs');
const dbVersion = '0.0.0'; const dbVersion = '0.0.0';
function migrateDb(oldVersion, sequelize) { function migrateDb(oldVersion, sequelize) {
const models = sequelize.models;
// if (oldVersion < targetVersion) { // if (oldVersion < targetVersion) {
// migrate db here // migrate db here
// } // }

View File

@ -0,0 +1,44 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('BookReference', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
name: {
type: Sequelize.STRING,
allowNull: false,
},
description: {
type: Sequelize.STRING,
allowNull: false,
comment: 'The description is attempted to be made up of the type of work and the author',
},
sources: {
type: Sequelize.JSON,
allowNull: false,
defaultValue: [],
comment: 'A JSON array with each element being an object with named source <STRING> and source id <STRING>',
},
covers: {
type: Sequelize.JSON,
allowNull: false,
defaultValue: [],
comment: 'A JSON array with each element being an object with image url <STRING> and source id <STRING>',
},
}, {
timestamps: false,
indexes: [
{
unique: true,
fields: ['name', 'description'],
},
{
fields: ['name'],
},
{
fields: ['description'],
},
],
});

View File

@ -0,0 +1,21 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('PermissionLevel', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: false,
comment: 'Represents the level number with 100 being the private and 0 being public',
},
name: {
type: Sequelize.STRING,
unique: true,
allowNull: false,
},
description: {
type: Sequelize.STRING,
allowNull: false,
},
}, {
timestamps: false,
});

View File

@ -0,0 +1,69 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('Recommendation', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
fromUser: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: sequelize.models.User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
},
toUser: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
},
text: {
type: Sequelize.TEXT,
allowNull: false,
validate: {
isNotBlank: value => value.length > 2,
}
},
bookId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
},
data: {
type: Sequelize.JSON,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
paranoid: true, // If toUser deletes recommendation, keep in database so fromUser can still see that they sent the recommendation.
indexes: [
{
fields: ['toUser'],
},
{
fields: ['fromUser'],
},
],
});

View File

@ -0,0 +1,70 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('Review', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
permissionLevel: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.PermissionLevel,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
text: {
type: Sequelize.TEXT,
allowNull: true,
},
bookReferenceId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
bookEdition: {
type: Sequelize.JSON,
allowNull: true,
comment: 'An object with properties `source` <STRING> and `id` <STRING> where `source` is the domain where the edition was taken from `id` is the reference to the edition in source',
},
rating: {
type: Sequelize.INTEGER,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
indexes: [
{
fields: ['userId'],
},
{
fields: ['bookReferenceId'],
},
],
});

View File

@ -0,0 +1,60 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('Shelf', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
name: {
type: Sequelize.STRING,
allowNull: false,
validate: {
len: [1, 32],
},
},
permissionLevel: {
type: Sequelize.BOOLEAN,
allowNull: false,
references: {
model: sequelize.models.PermissionLevel,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
isDeletable: {
type: Sequelize.BOOLEAN,
allowNull: false,
defaultValue: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
indexes: [
{
fields: ['userId'],
},
{
fields: ['permissionLevel'],
},
],
});

View File

@ -0,0 +1,54 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('ShelfItem', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
shelfId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.Shelf,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
bookId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.BookReference,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
}
},
bookEdition: {
type: Sequelize.JSON,
allowNull: true,
comment: 'An object with properties `source` <STRING> and `id` <STRING> where `source` is the domain where the edition was taken from `id` is the reference to the edition in source',
},
order: {
type: Sequelize.INTEGER,
defaultValue: 0,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
indexes: [
{
fields: ['shelfId'],
},
],
});

View File

@ -0,0 +1,67 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('Status', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.User,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
},
permissionLevel: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.PermissionLevel,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
comment: 'This permission level should be the level of the ShelfItem or lower.',
},
text: {
type: Sequelize.TEXT,
allowNull: true,
},
shelfItemId: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: sequelize.models.ShelfItem,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
},
progress: {
type: Sequelize.INTEGER,
allowNull: true,
comment: 'A number from 0 to 100 that represents percent completion',
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
indexes: [
{
fields: ['userId'],
},
{
fields: ['shelfItemId'],
},
],
});

View File

@ -0,0 +1,68 @@
const Sequelize = require('sequelize');
module.exports = sequelize => sequelize.define('User', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
},
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
isEmail: true,
len: [5, 150],
},
},
username: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
validate: {
is: /^[a-z0-9_]+$/i, // Is a set of characters a-z, 0-9, or _, case insensitive
len: [2, 32],
},
},
displayName: {
type: Sequelize.STRING,
allowNull: false,
validate: {
len: [1, 32],
},
},
permissionLevel: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: sequelize.models.PermissionLevel,
key: 'id',
deferrable: Sequelize.Deferrable.INITIALLY_IMMEDIATE,
},
comment: 'Enable profile to be viewed only by users of this permission level. "Followers" is interpreted as "Users this user is following" for this case.',
},
passwordHash: {
type: Sequelize.STRING,
allowNull: false,
},
passwordSalt: {
type: Sequelize.STRING,
allowNull: false,
},
accountConfirm: {
type: Sequelize.STRING,
allowNull: true,
},
// Timestamps
createdAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
updatedAt: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
});

View File

@ -0,0 +1,22 @@
const path = require('path');
module.exports = sequelize => {
const modelNames = [ // This is the order required to correctly get references.
'PermissionLevel',
'User',
'BookReference',
'Shelf',
'ShelfItem',
'Status',
'Review',
'Recommendation',
];
const models = {};
modelNames.forEach(modelName => {
const filename = `./${modelName}.js`;
models[modelName] = require(path.resolve(__dirname, filename))(sequelize);
});
return require(path.resolve(__dirname, '../associations'))(models);
};

View File

@ -37,6 +37,7 @@ switch (siteConfig.db_engine) {
} }
const sequelize = new Sequelize(sequelizeConfig); const sequelize = new Sequelize(sequelizeConfig);
const models = require('./models')(sequelize);
const migration = require('./migration'); const migration = require('./migration');
const dbVersionPath = path.resolve(__dirname, './.dbversion'); const dbVersionPath = path.resolve(__dirname, './.dbversion');
@ -45,7 +46,7 @@ if (!force) {
const installedDbVersion = fs.readFileSync(dbVersionPath); const installedDbVersion = fs.readFileSync(dbVersionPath);
if (installedDbVersion < migration.dbVersion) { if (installedDbVersion < migration.dbVersion) {
console.log(`Migrating from ${installedDbVersion} to ${migration.dbVersion}...`); console.log(`Migrating from ${installedDbVersion} to ${migration.dbVersion}...`);
migration.migrateDb(installedDbVersion, sequelize); migration.migrateDb(installedDbVersion, sequelize, models);
return fs.writeFile(dbVersionPath, migration.dbVersion, err => { return fs.writeFile(dbVersionPath, migration.dbVersion, err => {
if (err) { if (err) {
console.error(err); console.error(err);
@ -63,8 +64,34 @@ if (!force) {
console.log(`Installing database tables${force ? ', dropping existing ones first' : ''}...`); console.log(`Installing database tables${force ? ', dropping existing ones first' : ''}...`);
sequelize.sync({ force }).then(() => { sequelize.sync({ force }).then(() => {
console.log(`Tables installed! Creating Permission Levels...`);
return models.PermissionLevel.bulkCreate([
{
id: 100,
name: 'db.privacyLevel.private',
description: 'db.privacyLevel.privateDescription',
},
{
id: 66,
name: 'db.privacyLevel.friends',
description: 'db.privacyLevel.friendsDescription',
},
{
id: 33,
name: 'db.privacyLevel.followers',
description: 'db.privacyLevel.followersDescription',
},
{
id: 0,
name: 'db.privacyLevel.public',
description: 'db.privacyLevel.publicDescription',
},
]).catch((err) => {
console.error('Could not create Permission Levels:\n', err);
});
}).then(() => {
sequelize.close(); sequelize.close();
console.log(`Tables installed! Writing database version to ${dbVersionPath}...`); console.log(`Permission Levels created! Writing database version to ${dbVersionPath}...`);
fs.writeFile(dbVersionPath, migration.dbVersion, err => { fs.writeFile(dbVersionPath, migration.dbVersion, err => {
if (err) { if (err) {
console.error(err); console.error(err);

View File

@ -4608,22 +4608,6 @@ node-libs-browser@^2.0.0:
util "^0.11.0" util "^0.11.0"
vm-browserify "^1.0.1" vm-browserify "^1.0.1"
node-pre-gyp@*:
version "0.14.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
dependencies:
detect-libc "^1.0.2"
mkdirp "^0.5.1"
needle "^2.2.1"
nopt "^4.0.1"
npm-packlist "^1.1.6"
npmlog "^4.0.2"
rc "^1.2.7"
rimraf "^2.6.1"
semver "^5.3.0"
tar "^4.4.2"
node-pre-gyp@^0.11.0: node-pre-gyp@^0.11.0:
version "0.11.0" version "0.11.0"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054"
@ -5215,10 +5199,10 @@ pg-types@^2.1.0:
postgres-date "~1.0.4" postgres-date "~1.0.4"
postgres-interval "^1.1.0" postgres-interval "^1.1.0"
pg@^7.16.0: pg@^7.17.0:
version "7.17.0" version "7.17.1"
resolved "https://registry.yarnpkg.com/pg/-/pg-7.17.0.tgz#1fcf82238dcbebea63e192c944345c25c86992fc" resolved "https://registry.yarnpkg.com/pg/-/pg-7.17.1.tgz#1eb4d900e1f21f43978b306972b02a2329138755"
integrity sha512-70Q4ZzIdPgwMPb3zUIzAUwigNJ4v5vsWdMED6OzXMfOECeYTvTm7iSC3FpKizu/R1BHL8Do3bLs6ltGfOTAnqg== integrity sha512-SYWEip6eADsgDQIZk0bmB2JDOrC8Xu6z10KlhlXl03NSomwVmHB6ZTVyDCwOfT6bXHI8QndJdk5XxSSRXikaSA==
dependencies: dependencies:
buffer-writer "2.0.0" buffer-writer "2.0.0"
packet-reader "1.0.0" packet-reader "1.0.0"
@ -6914,7 +6898,7 @@ tar-stream@^2.0.0:
inherits "^2.0.3" inherits "^2.0.3"
readable-stream "^3.1.1" readable-stream "^3.1.1"
tar@^4, tar@^4.4.2: tar@^4:
version "4.4.13" version "4.4.13"
resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==