import '../authorization/authorization'; import 'reflect-metadata'; import { Request, RequestHandler, Response } from 'express'; import validation from 'express-joi-validation'; import { Container, inject } from 'inversify'; import { controller, httpGet, httpPost } from 'inversify-express-utils'; import * as Joi from 'joi'; import uuidv4 from 'uuid/v4'; import TYPES from '../constants/types'; import Playlist from '../model/playlist'; import Token from '../model/token'; import User from '../model/user'; import Store from '../store/store'; import { getUrl } from '../utils/config'; const validator = validation({}); const postBodySchema: Joi.Schema = Joi.object({ name: Joi.string().required(), public: Joi.boolean() .optional() .default(true), collaborative: Joi.boolean() .optional() .default(false), description: Joi.string().optional(), }); export function playlistControllerFactory(container: Container) { @controller('') class PlaylistController { constructor( @inject(TYPES.PlaylistStore) private store: Store, @inject(TYPES.UserStore) private userStore: Store, @inject(TYPES.TokenStore) private tokenStore: Store, ) {} @httpPost('/v1/users/:user_id/playlists', validator.body(postBodySchema)) public createPlaylist(req: Request, res: Response): void { const playlistId = uuidv4(); const user = this.userStore.get(req.params.user_id); if (!user) { res.status(404).send({ error: { status: 404, message: 'No such user', }, }); } res.status(201).send(this.store.save({ collaborative: req.body.collaborative || false, external_urls: {}, href: `${getUrl()}/v1/playlists/${playlistId}`, id: playlistId, images: [], name: req.body.name, owner: { display_name: user.display_name, href: user.href, id: user.id, type: user.type, uri: user.uri, }, public: req.body.public || true, type: 'playlist', uri: `spotify:playlist:${playlistId}`, })); } @httpGet('/v1/me/playlists', container.get(TYPES.Authorization)) public getMyPlaylists(req: Request, res: Response): void { const playlists = this.store.getAll().filter((playlist) => { return playlist.owner.id === req.userId; }); res.json({ items: playlists, }); } } }