const express = require('express') const { Op } = require("sequelize") module.exports = function (options) { const db = options.db; var router = express.Router(); router.route('/:id') .get(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.TranslationChapters, limit: 1, required: true } // { // association: db.TranslationArtifactVersion.ArtifactVersion, // required: true, // include: [ // { // association: db.ArtifactVersion.Chapters, // required: true, // limit: 1, // // TODO: Order by chapter index // } // ] // } ] }).then(translationArtifactVersion => { if (translationArtifactVersion) { response.redirect(`/translate/${translationArtifactVersion.id}/chapter/${translationArtifactVersion.translationChapters[0].id}`) } else { next() } }) }) router.route('/:id/chapter/:chapterId') .get(function(request, response, next) { db.TranslationChapter.findByPk(request.params.chapterId, { include: [ { association: db.TranslationChapter.TranslationChunks, include: [ { association: db.TranslationChunk.Translation } ] }, { association: db.TranslationChapter.TranslationArtifactVersion, include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact, include: [ { association: db.Artifact.Dialect } ] } ] }, { association: db.TranslationArtifactVersion.Dialect }, { association: db.TranslationArtifactVersion.BackTranslationFrom } ] } ] }).then(translationChapter => { if (translationChapter) { response.display("translate-chapter", { user: request.user, pageTitle: `Translate Chapter ${translationChapter.name}`, translationChapter: translationChapter }) } else { next() } }).catch(error => { next(error) }) }) router.route('/:id/chapter/:chapterId/view') .get(function(request, response, next) { db.TranslationChapter.findByPk(request.params.chapterId, { include: [ { association: db.TranslationChapter.TranslationChunks, include: [ { association: db.TranslationChunk.Translation } ] }, { association: db.TranslationChapter.TranslationArtifactVersion, include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact, include: [ { association: db.Artifact.Dialect } ] } ] } ] } ] }).then(translationChapter => { if (translationChapter) { response.display("translate-chapter-view", { user: request.user, pageTitle: `Translate Chapter ${translationChapter.name}`, translationChapter: translationChapter }) } else { next() } }).catch(error => { next(error) }) }) router.route('/:id/chapter/:chapterId/t/:chunkIndex') .get(function(request, response, next) { const previousIndex = Number(request.params.chunkIndex)-1 const nextIndex = Number(request.params.chunkIndex)+1 db.TranslationChunk.findAll({ where: { translationChapterId: request.params.chapterId, index: { [Op.between]: [ previousIndex, nextIndex ], } }, limit: 3, include: [ { association: db.TranslationChunk.Translation }, { association: db.TranslationChunk.TranslationChapter, required: true, include: [ { association: db.TranslationChapter.TranslationArtifactVersion, required: true, include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact, include: [ { association: db.Artifact.Dialect } ] } ] } ] } ] } ] }).then(translationChunks => { if (translationChunks.length > 0) { const translationChunk = translationChunks.find(translationChunk => translationChunk.index == Number(request.params.chunkIndex)) if (translationChunk) { response.display("translate-chunk", { user: request.user, pageTitle: `Translate ${translationChunk.translationChapter.translationArtifactVersion.artifactVersion.artifact.name}`, translationChunk: translationChunk, previousTranslationChunk: translationChunks.find(translationChunk => translationChunk.index == previousIndex), nextTranslationChunk: translationChunks.find(translationChunk => translationChunk.index == nextIndex) }) } else { response.redirect(`/translate/${request.params.id}/chapter/${request.params.chapterId}`) } } else { next() } }).catch(error => { next(error) }) }) .post(function(request, response, next) { db.TranslationChunk.findOne({ where: { translationChapterId: request.params.chapterId, index: request.params.chunkIndex }, include: [ { association: db.TranslationChunk.Translation }, { association: db.TranslationChunk.TranslationChapter, required: true, include: [ { association: db.TranslationChapter.TranslationArtifactVersion, include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact, include: [ { association: db.Artifact.Dialect } ] } ] } ] } ] } ] }).then(async (translationChunk) => { if (translationChunk) { if (translationChunk.translation) { translationChunk.translation.text = request.body.translatedText await translationChunk.translation.save() } else { translation = await db.Translation.create({ creatorId: request.user.id, translationChunkId: translationChunk.id, text: request.body.translatedText, translationArtifactVersionId: request.params.id }) } response.redirect(`/translate/${request.params.id}/chapter/${request.params.chapterId}/t/${Number(request.params.chunkIndex)+1}`) } else { next() } }).catch(error => { next(error) }) }) router.route('/:id/back') .post(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.Dialect, }, { association: db.TranslationArtifactVersion.TranslationChapters, include: [ { association: db.TranslationChapter.TranslationChunks, include: [ { association: db.TranslationChunk.Translation, } ] } ] }, { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact, include: [ { association: db.Artifact.Dialect } ] } ] }, { association: db.TranslationArtifactVersion.BackTranslation, }, ] }).then((translationArtifactVersion) => { if (translationArtifactVersion) { if (translationArtifactVersion.backTranslation) { // translationArtifactVersion has a back translation...xx§ return translationArtifactVersion.backTranslation } else { return db.TranslationArtifactVersion.create({ creatorId: request.user.id, name: translationArtifactVersion.artifactVersion.artifact.dialect.name, artifactVersionId: translationArtifactVersion.artifactVersionId, dialectId: translationArtifactVersion.dialect.id, backTranslationFromId: translationArtifactVersion.id, entityId: request.user.individualEntityUser.entityUser.entityId, translationChapters: translationArtifactVersion.translationChapters.map(translationChapter => { return { creatorId: request.user.id, chapterId: translationChapter.chapterId, translationChunks: translationChapter.translationChunks.map(translationChunk => { return { creatorId: request.user.id, chunkId: translationChunk.chunkId, text: translationChunk.translation.text, index: translationChunk.index } }) } }) }, { include: [ { association: db.TranslationArtifactVersion.TranslationChapters, include: [ { association: db.TranslationChapter.TranslationChunks } ] } ] }) } } else { return null } }).then(translationArtifactVersion => { if (translationArtifactVersion) { response.redirect(`/translate/${translationArtifactVersion.id}`) } else { next() } }).catch(error => { next(error) }) }) router.route('/:id/campaigns') .get(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.TranslationArtifactVersionCampaigns, required: true, include: [ { association: db.TranslationArtifactVersionCampaign.Campaign, required: true } ] } ] }).then(translationArtifactVersion => { if (translationArtifactVersion) { if (translationArtifactVersion.translationArtifactVersionCampaigns.length == 1) { response.redirect(`/campaigns/${translationArtifactVersion.translationArtifactVersionCampaigns[0].campaignId}`) } else { // TODO: Display translation artifact campaign... next() } } else { response.redirect(`/translate/${request.params.id}/campaigns/create`) } }) }) router.route('/:id/campaigns/create') .get(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact } ] }, { association: db.TranslationArtifactVersion.TranslationArtifactVersionCampaigns, required: false, include: [ { association: db.TranslationArtifactVersionCampaign.Campaign, required: false } ] } ] }).then(translationArtifactVersion => { if (translationArtifactVersion) { response.display("campaign-form", { user: request.user, pageTitle: "Campaign - Mantra", campaign: { name: `Campaign for ${translationArtifactVersion.name} translation of ${translationArtifactVersion.artifactVersion.artifact.name}` }, translationArtifactVersions: [translationArtifactVersion] }) } else { next() } }).catch(error => { next(error) }) }) .post(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact } ] }, { association: db.TranslationArtifactVersion.TranslationArtifactVersionCampaigns, required: false, include: [ { association: db.TranslationArtifactVersionCampaign.Campaign, required: false } ] } ] }).then(async (translationArtifactVersion) => { if (translationArtifactVersion) { // TODO: Create campaign... const campaign = await db.Campaign.create({ creatorId: request.user.id, name: request.body.name, description: request.body.description, // defaultSatoshis: [request.body.satoshis].flat()[0], defaultSatoshis: request.body.satoshis, entityId: request.user.individualEntityUser.entityUser.entityId, translationArtifactVersionCampaigns: [ { creatorId: request.user.id, translationArtifactVersionId: translationArtifactVersion.id, entityId: request.user.individualEntityUser.entityUser.entityId, satoshis: request.body.satoshis } ] }, { include: [ { association: db.Campaign.TranslationArtifactVersionCampaigns } ] }) response.redirect(`/campaigns/${campaign.id}`) } else { next() } }).catch(error => { next(error) }) }) router.route('/:id/pledges') .get(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.TranslationArtifactVersionPledges, required: true, include: [ { association: db.TranslationArtifactVersionPledge.Pledge, required: true } ] } ] }).then(translationArtifactVersion => { if (translationArtifactVersion) { if (translationArtifactVersion.translationArtifactVersionPledges.length == 1) { response.redirect(`/pledges/${translationArtifactVersion.translationArtifactVersionPledges[0].campaignId}`) } else { // TODO: Display translation artifact campaign... next() } } else { response.redirect(`/translate/${request.params.id}/pledges/create`) } }) }) router.route('/:id/pledges/create') .get(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact } ] }, { association: db.TranslationArtifactVersion.TranslationArtifactVersionPledges, required: false, include: [ { association: db.TranslationArtifactVersionPledge.Pledge, required: false } ] } ] }).then(translationArtifactVersion => { if (translationArtifactVersion) { response.display("pledge-form", { user: request.user, pageTitle: "Pledge - Mantra", campaign: { name: `Pledge for ${translationArtifactVersion.name} translation of ${translationArtifactVersion.artifactVersion.artifact.name}`, }, translationArtifactVersions: [translationArtifactVersion] }) } else { next() } }).catch(error => { next(error) }) }) .post(function(request, response, next) { db.TranslationArtifactVersion.findByPk(request.params.id, { include: [ { association: db.TranslationArtifactVersion.ArtifactVersion, include: [ { association: db.ArtifactVersion.Artifact } ] }, { association: db.TranslationArtifactVersion.TranslationArtifactVersionPledges, required: false, include: [ { association: db.TranslationArtifactVersionPledge.Pledge, required: false } ] } ] }).then(async (translationArtifactVersion) => { if (translationArtifactVersion) { // TODO: Create campaign... const pledge = await db.Pledge.create({ creatorId: request.user.id, message: request.body.message, entityId: request.user.individualEntityUser.entityUser.entityId, translationArtifactVersionPledges: [ { creatorId: request.user.id, translationArtifactVersionId: translationArtifactVersion.id, entityId: request.user.individualEntityUser.entityUser.entityId, satoshis: request.body.satoshis } ] }, { include: [ { association: db.Pledge.TranslationArtifactVersionPledges } ] }) response.redirect(`/pledges/${pledge.id}`) } else { next() } }).catch(error => { next(error) }) }) return router; };