2016-02-07 11:23:23 +01:00
|
|
|
'use strict'
|
|
|
|
|
2016-10-21 11:20:45 +02:00
|
|
|
const each = require('async/each')
|
2016-03-16 22:29:27 +01:00
|
|
|
const mongoose = require('mongoose')
|
2016-06-28 20:10:32 +02:00
|
|
|
const map = require('lodash/map')
|
2016-06-30 22:39:08 +02:00
|
|
|
const validator = require('express-validator').validator
|
2016-02-07 11:23:23 +01:00
|
|
|
|
2016-03-16 22:29:27 +01:00
|
|
|
const constants = require('../initializers/constants')
|
2016-02-07 11:23:23 +01:00
|
|
|
|
2016-10-21 11:20:45 +02:00
|
|
|
const Video = mongoose.model('Video')
|
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
const PodSchema = mongoose.Schema({
|
2016-02-07 11:23:23 +01:00
|
|
|
url: String,
|
|
|
|
publicKey: String,
|
2016-08-26 18:55:10 +02:00
|
|
|
score: { type: Number, max: constants.FRIEND_SCORE.MAX },
|
|
|
|
createdDate: {
|
|
|
|
type: Date,
|
|
|
|
default: Date.now
|
|
|
|
}
|
2016-02-07 11:23:23 +01:00
|
|
|
})
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
// TODO: set options (TLD...)
|
|
|
|
PodSchema.path('url').validate(validator.isURL)
|
|
|
|
PodSchema.path('publicKey').required(true)
|
|
|
|
PodSchema.path('score').validate(function (value) { return !isNaN(value) })
|
2016-02-07 11:23:23 +01:00
|
|
|
|
2016-08-26 18:55:10 +02:00
|
|
|
PodSchema.methods = {
|
2016-10-02 12:19:02 +02:00
|
|
|
toFormatedJSON
|
2016-08-26 18:55:10 +02:00
|
|
|
}
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
PodSchema.statics = {
|
2016-10-02 12:19:02 +02:00
|
|
|
countAll,
|
|
|
|
incrementScores,
|
|
|
|
list,
|
|
|
|
listAllIds,
|
|
|
|
listBadPods,
|
|
|
|
load,
|
|
|
|
loadByUrl,
|
|
|
|
removeAll
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
PodSchema.pre('save', function (next) {
|
|
|
|
const self = this
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
Pod.loadByUrl(this.url, function (err, pod) {
|
|
|
|
if (err) return next(err)
|
2016-01-23 18:31:58 +01:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
if (pod) return next(new Error('Pod already exists.'))
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
self.score = constants.FRIEND_SCORE.BASE
|
|
|
|
return next()
|
|
|
|
})
|
|
|
|
})
|
2016-01-23 18:31:58 +01:00
|
|
|
|
2016-10-21 11:20:45 +02:00
|
|
|
PodSchema.pre('remove', function (next) {
|
|
|
|
// Remove the videos owned by this pod too
|
|
|
|
Video.listByUrl(this.url, function (err, videos) {
|
|
|
|
if (err) return next(err)
|
|
|
|
|
|
|
|
each(videos, function (video, callbackEach) {
|
|
|
|
video.remove(callbackEach)
|
|
|
|
}, next)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
const Pod = mongoose.model('Pod', PodSchema)
|
2016-06-18 16:13:54 +02:00
|
|
|
|
2016-08-26 18:55:10 +02:00
|
|
|
// ------------------------------ METHODS ------------------------------
|
|
|
|
|
|
|
|
function toFormatedJSON () {
|
|
|
|
const json = {
|
|
|
|
id: this._id,
|
|
|
|
url: this.url,
|
|
|
|
score: this.score,
|
|
|
|
createdDate: this.createdDate
|
|
|
|
}
|
|
|
|
|
|
|
|
return json
|
|
|
|
}
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
// ------------------------------ Statics ------------------------------
|
|
|
|
|
|
|
|
function countAll (callback) {
|
|
|
|
return this.count(callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2016-01-23 18:31:58 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
function incrementScores (ids, value, callback) {
|
|
|
|
if (!callback) callback = function () {}
|
2016-06-30 22:39:08 +02:00
|
|
|
return this.update({ _id: { $in: ids } }, { $inc: { score: value } }, { multi: true }, callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2016-01-23 18:31:58 +01:00
|
|
|
|
2016-02-07 11:23:23 +01:00
|
|
|
function list (callback) {
|
2016-06-30 22:39:08 +02:00
|
|
|
return this.find(callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-06-18 16:13:54 +02:00
|
|
|
function listAllIds (callback) {
|
2016-06-30 22:39:08 +02:00
|
|
|
return this.find({}, { _id: 1 }, function (err, pods) {
|
2016-06-28 20:10:32 +02:00
|
|
|
if (err) return callback(err)
|
|
|
|
|
|
|
|
return callback(null, map(pods, '_id'))
|
|
|
|
})
|
2016-06-18 16:13:54 +02:00
|
|
|
}
|
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
function listBadPods (callback) {
|
|
|
|
return this.find({ score: 0 }, callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2015-06-09 17:41:40 +02:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
function load (id, callback) {
|
|
|
|
return this.findById(id, callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2016-01-31 11:23:52 +01:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
function loadByUrl (url, callback) {
|
|
|
|
return this.findOne({ url: url }, callback)
|
2016-02-07 11:23:23 +01:00
|
|
|
}
|
2016-01-31 11:23:52 +01:00
|
|
|
|
2016-06-30 22:39:08 +02:00
|
|
|
function removeAll (callback) {
|
|
|
|
return this.remove({}, callback)
|
|
|
|
}
|