open-music-api-node
Version:
127 lines (103 loc) • 3.51 kB
JavaScript
class AlbumHandler {
constructor(service, validator, storage, uploadValidator) {
console.log('AlbumHandler constructor called.');
this._service = service;
this._validator = validator;
this._storage = storage;
this._uploadValidator = uploadValidator;
this.addAlbumHandler = this.addAlbumHandler.bind(this);
this.getAlbumByIdHandler = this.getAlbumByIdHandler.bind(this);
this.updateAlbumByIdHandler = this.updateAlbumByIdHandler.bind(this);
this.deleteAlbumByIdHandler = this.deleteAlbumByIdHandler.bind(this);
this.addCoversHandler = this.addCoversHandler.bind(this);
this.likesAlbumHandler = this.likesAlbumHandler.bind(this);
this.dislikesAlbumHandler = this.dislikesAlbumHandler.bind(this);
this.likesAlbumCountHandler = this.likesAlbumCountHandler.bind(this);
}
async addCoversHandler(request, h) {
const { cover: data } = request.payload;
this._uploadValidator.validateImageHeaders(data.hapi.headers);
const { id } = request.params;
const filename = await this._storage.writeFile(data, data.hapi, 'albums');
const fileUrl = `http://${process.env.HOST}:${process.env.PORT}/images/albums/${filename}`;
await this._service.updateAlbumImage(id, fileUrl);
const response = h.response({
status: 'success',
message: 'Sampul berhasil diunggah',
});
response.code(201);
return response;
}
async addAlbumHandler(request, h) {
this._validator.validateAlbumPayload(request.payload);
const { name, year } = request.payload;
const album = await this._service.addAlbum({ name, year });
const response = h.response({
status: 'success',
message: 'Album baru berhasil ditambahkan',
data: {
albumId: album,
},
});
response.code(201);
return response;
}
async getAlbumByIdHandler(request) {
const { id } = request.params;
const album = await this._service.getAlbumById(id);
return {
status: 'success',
data: {
album,
},
};
}
async updateAlbumByIdHandler(request) {
this._validator.validateAlbumPayload(request.payload);
const { name, year } = request.payload;
const { id } = request.params;
await this._service.updateAlbumById(id, { name, year });
return {
status: 'success',
message: 'Album berhasil diperbarui',
};
}
async deleteAlbumByIdHandler(request) {
const { id } = request.params;
await this._service.deleteAlbumById(id);
return {
status: 'success',
message: 'Album berhasil dihapus',
};
}
async likesAlbumHandler(request, h) {
const { id } = request.params;
const { id: userId } = request.auth.credentials;
await this._service.likesAlbum(id, userId);
const response = h.response({
status: 'success',
message: 'Menyukai album',
});
response.code(201);
return response;
}
async dislikesAlbumHandler(request) {
const { id } = request.params;
const { id: userId } = request.auth.credentials;
await this._service.dislikesAlbum(id, userId);
return {
status: 'success',
message: 'Batal menyukai album',
};
}
async likesAlbumCountHandler(request, h) {
const { id } = request.params;
const [likes, cache] = await this._service.likesAlbumCount(id);
const response = h.response(likes);
if (cache) {
response.header('X-Data-Source', 'cache');
}
return response;
}
}
module.exports = AlbumHandler;