diff options
Diffstat (limited to 'src/server/api/models/channel.ts')
| -rw-r--r-- | src/server/api/models/channel.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/server/api/models/channel.ts b/src/server/api/models/channel.ts new file mode 100644 index 0000000000..9f94c5a8d1 --- /dev/null +++ b/src/server/api/models/channel.ts @@ -0,0 +1,75 @@ +import * as mongo from 'mongodb'; +import deepcopy = require('deepcopy'); +import { IUser } from './user'; +import Watching from './channel-watching'; +import db from '../../../db/mongodb'; + +const Channel = db.get<IChannel>('channels'); +export default Channel; + +export type IChannel = { + _id: mongo.ObjectID; + createdAt: Date; + title: string; + userId: mongo.ObjectID; + index: number; + watchingCount: number; +}; + +/** + * Pack a channel for API response + * + * @param channel target + * @param me? serializee + * @return response + */ +export const pack = ( + channel: string | mongo.ObjectID | IChannel, + me?: string | mongo.ObjectID | IUser +) => new Promise<any>(async (resolve, reject) => { + + let _channel: any; + + // Populate the channel if 'channel' is ID + if (mongo.ObjectID.prototype.isPrototypeOf(channel)) { + _channel = await Channel.findOne({ + _id: channel + }); + } else if (typeof channel === 'string') { + _channel = await Channel.findOne({ + _id: new mongo.ObjectID(channel) + }); + } else { + _channel = deepcopy(channel); + } + + // Rename _id to id + _channel.id = _channel._id; + delete _channel._id; + + // Remove needless properties + delete _channel.userId; + + // Me + const meId: mongo.ObjectID = me + ? mongo.ObjectID.prototype.isPrototypeOf(me) + ? me as mongo.ObjectID + : typeof me === 'string' + ? new mongo.ObjectID(me) + : (me as IUser)._id + : null; + + if (me) { + //#region Watchしているかどうか + const watch = await Watching.findOne({ + userId: meId, + channelId: _channel.id, + deletedAt: { $exists: false } + }); + + _channel.isWatching = watch !== null; + //#endregion + } + + resolve(_channel); +}); |