DB Models for Image, Album, based on Data

This commit is contained in:
tmshv committed 2017-05-25 21:48:11 +03:00
1 parent b829885b00
commit b69c19239e
5 files changed
+106 -16

No files matched your search

+40
View File
@@ -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
+13
View File
@@ -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
+12
View File
@@ -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
+25 -16
View File
@@ -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
}
+16
View File
@@ -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