diff --git a/src/core/Album.js b/src/core/Album.js new file mode 100644 index 00000000..52f24798 --- /dev/null +++ b/src/core/Album.js @@ -0,0 +1,40 @@ +const Data = require('./Data') +const Image = require('./Image') +const {find, findOne} = require('../lib/store') + +const store = () => Data.getStore(Album) + +class Album { + static async find(query, options = {}) { + const items = await find(store(), query, options) + + return Promise.all(items.map(processAlbum)) + } + + static async findById(id) { + const item = await findOne(store(), {id}) + + return !item + ? null + : processAlbum(item) + } +} + +const previewFromImage = (imgs = []) => imgs.length ? imgs[0] : null + +const processAlbum = async album => { + const previewImageId = album.preview ? album.preview : previewFromImage(album.images) + let preview + if (previewImageId) { + const image = await Image.findById(previewImageId) + preview = image.data.medium + } + + return { + ...album, + preview, + url: `/album/${album.id}`, + } +} + +module.exports = Album diff --git a/src/core/Data.js b/src/core/Data.js new file mode 100644 index 00000000..5f84f721 --- /dev/null +++ b/src/core/Data.js @@ -0,0 +1,13 @@ +const store = new Map() + +class Data { + static setStore(Class, collection) { + store.set(Class, collection) + } + + static getStore(Class) { + return store.get(Class) + } +} + +module.exports = Data diff --git a/src/core/Image.js b/src/core/Image.js new file mode 100644 index 00000000..2f1db37d --- /dev/null +++ b/src/core/Image.js @@ -0,0 +1,12 @@ +const Data = require('./Data') +const {findOne} = require('../lib/store') + +const store = () => Data.getStore(Image) + +class Image { + static async findById(id) { + return findOne(store(), {_id: id}) + } +} + +module.exports = Image diff --git a/src/core/db.js b/src/core/db.js index 73a85352..08ce00fb 100644 --- a/src/core/db.js +++ b/src/core/db.js @@ -1,24 +1,33 @@ -import {MongoClient, ObjectId} from 'mongodb'; -import co from 'co'; +const Data = require('./Data') +const Album = require('./Album') +const Image = require('./Image') -export var db; +const {MongoClient, ObjectId} = require('mongodb') -export function connect(uri){ - return co(function*() { - db = yield MongoClient.connect(uri); - return db; - }) +export var db + +export async function connect(uri) { + const c = await MongoClient.connect(uri) + db = init(c) + return db } -export function collection(name){ - return db.collection(name); +export function collection(name) { + return db.collection(name) } -export const c = collection; +export const c = collection -export function id(i){ - if(typeof i === 'string')return ObjectId(i); - else if(i instanceof ObjectId) return i; - else if(i instanceof Object) return '_id' in i ? ObjectId(i._id) : null; - return null; +export function id(i) { + if (typeof i === 'string') return ObjectId(i) + else if (i instanceof ObjectId) return i + else if (i instanceof Object) return '_id' in i ? ObjectId(i._id) : null + return null +} + +function init(db) { + Data.setStore(Album, db.collection('albums')) + Data.setStore(Image, db.collection('images')) + + return db } diff --git a/src/lib/store.js b/src/lib/store.js new file mode 100644 index 00000000..5fd464e6 --- /dev/null +++ b/src/lib/store.js @@ -0,0 +1,16 @@ +async function find(collection, query, {sort, skip, limit}) { + const cursor = collection.find(query) + + if (sort) cursor.sort(sort) + if (skip) cursor.skip(skip) + if (limit) cursor.limit(limit) + + return cursor.toArray() +} + +async function findOne(collection, query) { + return collection.findOne(query) +} + +exports.find = find +exports.findOne = findOne