diff --git a/src/client/app.js b/src/client/app.js index 182be1af..74639193 100644 --- a/src/client/app.js +++ b/src/client/app.js @@ -126,19 +126,6 @@ app.config(($locationProvider, $routeProvider) => { .then(i => i.data) } }, - { - name: '/album/:id', - template: '', - resolve: { - album: ($route, api) => { - let id = $route.current.params.id - - return api.album - .fetch(id) - .then(i => i.data) - } - } - }, { name: '/awards', template: '', diff --git a/src/models/menu.js b/src/models/menu.js index ec855658..384b61d9 100644 --- a/src/models/menu.js +++ b/src/models/menu.js @@ -45,9 +45,12 @@ export default [ 'color': 'pink' }, { - 'text': 'Галерея', - 'url': '/gallery', - 'color': 'red' + text: 'Галерея', + url: '/gallery', + color: 'red', + items: [ + {url: '/album/*', text: ''}, + ] }, { 'text': 'Документы', diff --git a/src/routes/albums.js b/src/routes/albums.js new file mode 100644 index 00000000..686f59b4 --- /dev/null +++ b/src/routes/albums.js @@ -0,0 +1,62 @@ +const React = require('react') +const Article = require('../components/Article') +const {render} = require('../lib/render') +const getPathWithNoTrailingSlash = require('../lib/url').getPathWithNoTrailingSlash +const {get} = require('koa-route') +const {c} = require('../core/db') + +async function findAlbum(id) { + return c('albums').findOne({id}) +} + +async function processAlbum(album) { + const url = `/album/${album.id}` + + const previewFromImage = imgs => imgs.length ? imgs[0] : null + const previewImageId = album.preview ? album.preview : previewFromImage(album.images) + if (previewImageId) { + const image = await c('images').findOne({_id: previewImageId}) + album.preview = image.data.medium + } + + return { + ...album, + url, + } +} + +function getMeta(album) { + return { + title: album.title, + description: album.title, + } +} + +function getAlbum() { + return get('/album/:id', async (ctx, id) => { + const path = getPathWithNoTrailingSlash(ctx.path) + const record = await findAlbum(id) + + if (record) { + const album = await processAlbum(record) + + const Component = ( +
+
+
+ ) + + ctx.type = 'text/html' + ctx.body = await render(path, Component, getMeta(album), {commentsEnabled: true}) + } else { + ctx.status = 404 + } + }) +} + +exports.getAlbum = getAlbum diff --git a/src/routes/gallery.js b/src/routes/gallery.js index 0b8be74c..a1341aec 100644 --- a/src/routes/gallery.js +++ b/src/routes/gallery.js @@ -6,7 +6,6 @@ import {json} from './'; export default function () { return compose([ gallery(), - album() ]); }; @@ -30,18 +29,6 @@ function gallery() { )); } -function album() { - return route.get('/album/:id', json( - async(ctx, id) => { - let record = await c('albums').findOne({ - id: id - }); - record = await processAlbum(record); - ctx.body = record; - } - )); -} - const processAlbum = async album => { album.url = `/album/${album.id}`; diff --git a/src/server.js b/src/server.js index 2606f33e..86e4ebbc 100644 --- a/src/server.js +++ b/src/server.js @@ -22,6 +22,7 @@ const config = require('./config') const error = require('./middlewares/error') const home = require('./routes/home') const article = require('./routes/articles') +const albums = require('./routes/albums') const dirPublic = path.join(__dirname, '../public') const dirTemplates = path.join(__dirname, 'templates') @@ -54,6 +55,7 @@ export default function (store) { app.use(home.getHome(5)) app.use(article.getArticles(5)) app.use(article.getArticle()) + app.use(albums.getAlbum()) app.use(routes(store)) return Server(app.callback())