Skip to content

Instantly share code, notes, and snippets.

@bookercodes
Created May 17, 2016 13:33
Show Gist options
  • Save bookercodes/f651cd0290605257a64022424ee2f72b to your computer and use it in GitHub Desktop.
Save bookercodes/f651cd0290605257a64022424ee2f72b to your computer and use it in GitHub Desktop.
// @flow
import db from 'sequelize-connect'
/**
* Creates and returns a Sequelize screencast model. (This function is to be
* called internally by the sequelize-connect module.)
*
* @param sequelize - A Sequelize connection
* @param DataTypes - A quasi enumeration of SQL data types
*/
const createScreencastModel = function (sequelize: any, DataTypes: any) : any {
const screencast: any = sequelize.define('screencast', {
id: {
primaryKey: true,
type: DataTypes.STRING
},
url: DataTypes.TEXT,
title: DataTypes.STRING,
description: DataTypes.TEXT,
durationInSeconds: DataTypes.INTEGER
}, {
classMethods: {
associate (models: any): any {
screencast.belongsTo(models.channel)
screencast.belongsToMany(models.tag, {
through: models.screencastTag,
foreignKey: 'screencastId'
})
},
async findAllScreencasts (): any {
const foundScreencasts = await db
.models
.screencast
.findAll({
include: [
{ model: db.models.channel },
{ model: db.models.tag }
]
})
return foundScreencasts
},
async createScreencast (screencast): any {
await db.sequelize.transaction(async transaction => {
const createdChannel = await db.models.channel.create({
id: screencast.channel.id,
name: screencast.channel.title
})
await createdChannel.createScreencast({
...screencast,
url: screencast.url
}, {
transaction
})
await db.models.tag.bulkCreate(screencast.tags, {
transaction
})
const screencastTags = screencast.tags.map(tag => {
return {
screencastId: screencast.id,
tagId: tag.id
}
})
await db.models.screencastTag.bulkCreate(screencastTags, {
transaction
})
})
}
}
})
return screencast
}
export default createScreencastModel
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment