Files
mantra.press/server/router/projects/index.js
2022-01-04 01:52:32 +02:00

500 lines
20 KiB
JavaScript

const express = require('express')
const XL = require('excel4node');
module.exports = function (options) {
const db = options.db;
var router = express.Router();
router.route('/')
.get(function(request, response, next) {
db.Project.findAll()
.then(projects => {
response.display("projects", {
user: request.user,
pageTitle: "Projects - Mantra",
projects: projects
})
})
})
router.route('/:id')
.get(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.ProjectEntryVersions,
include: [
{
association: db.ProjectEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
},
{
association: db.Project.ProjectTranslationEntryVersions,
include: [
{
association: db.ProjectTranslationEntryVersion.TranslationEntryVersion,
include: [
{
association: db.TranslationEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
}
]
}
]
}).then(project => {
if (project) {
response.display("project", {
user: request.user,
pageTitle: "Projects - Mantra",
project: project
})
} else {
next()
}
}).catch(error => {
next(error)
})
})
router.route('/create')
.get(function(request, response, next) {
response.display("project-form", {
user: request.user,
pageTitle: "Projects - Mantra",
project: {
}
})
})
.post(function(request, response, next) {
db.Project.create({
name: request.body.name,
description: request.body.description
}).then(project => {
if (project) {
response.redirect(`/projects/${project.id}`)
} else {
next()
}
}).catch(error => {
next(error)
})
})
router.route('/:id/add-entry')
.get(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.ProjectEntryVersions
},
{
association: db.Project.ProjectTranslationEntryVersions
}
]
}).then(async (project) => {
if (project) {
const entries = await db.Entry.findAll({
// Narrow it down to entries this user has admin ownership off...,
include: [
{
association: db.Entry.EntryVersions,
limit: 1,
required: true
// TODO: Order by version...
}
]
})
response.display("project-add-entry", {
user: request.user,
pageTitle: "Projects - Mantra",
project: project,
entries: entries
})
} else {
next()
}
}).catch(error => {
next(error)
})
})
.post(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.ProjectEntryVersions,
include: [
{
association: db.ProjectEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
},
{
association: db.Project.ProjectTranslationEntryVersions,
include: [
{
association: db.ProjectTranslationEntryVersion.TranslationEntryVersion,
include: [
{
association: db.TranslationEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
}
]
}
]
}).then(async (project) => {
if (project) {
// TODO: Fi
const entryVersion = await db.EntryVersion.findByPk(request.body.entryVersionId, {
// Narrow it down to entries this user has admin ownership off...,
})
if (entryVersion) {
const projectEntryVersion = db.ProjectEntryVersion.create({
projectId: project.id,
entryVersionId: entryVersion.id
})
response.redirect(`/projects/${project.id}`)
} else {
response.redirect(`/projects/${project.id}/add-entry`)
}
} else {
next()
}
}).catch(error => {
next(error)
})
})
router.route('/:id/add-translation')
.get(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.ProjectEntryVersions
},
{
association: db.Project.ProjectTranslationEntryVersions
}
]
}).then(async (project) => {
if (project) {
const translationEntryVersions = await db.TranslationEntryVersion.findAll({
// Narrow it down to entries this user has admin ownership off...,
include: [
{
association: db.TranslationEntryVersion.EntryVersion,
required: true,
// TODO: Order by version...
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
})
response.display("project-add-translation", {
user: request.user,
pageTitle: "Projects - Mantra",
project: project,
translationEntryVersions: translationEntryVersions
})
} else {
next()
}
}).catch(error => {
next(error)
})
})
.post(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.ProjectEntryVersions
},
{
association: db.Project.ProjectTranslationEntryVersions
}
]
}).then(async (project) => {
if (project) {
// TODO: Fi
const translationEntryVersion = await db.TranslationEntryVersion.findByPk(request.body.translationEntryVersionId, {
// Narrow it down to entries this user has admin ownership off...,
include: [
{
association: db.TranslationEntryVersion.EntryVersion,
required: true
// TODO: Order by version...
}
]
})
if (translationEntryVersion) {
const projectTranslationEntryVersion = db.ProjectTranslationEntryVersion.create({
projectId: project.id,
translationEntryVersionId: translationEntryVersion.id
})
response.redirect(`/projects/${project.id}`)
} else {
response.redirect(`/projects/${project.id}/add-translation`)
}
} else {
next()
}
}).catch(error => {
next(error)
})
})
router.route('/:id/campaign')
.get(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.Campaign,
required: true
},
{
association: db.Project.ProjectEntryVersions,
include: [
{
association: db.ProjectEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
},
{
association: db.Project.ProjectTranslationEntryVersions,
include: [
{
association: db.ProjectTranslationEntryVersion.TranslationEntryVersion,
include: [
{
association: db.TranslationEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry
}
]
}
]
}
]
}
]
}).then(project => {
if (project) {
response.redirect(`/campaigns/${project.campaign.id}`)
} else {
response.redirect(`/projects/${request.params.id}/campaign/create`)
}
})
})
router.route('/:id/campaign/create')
.get(function(request, response, next) {
db.Project.findByPk(request.params.id, {
include: [
{
association: db.Project.Campaign,
}
]
}).then(project => {
if (project) {
if (project.campaign) {
response.redirect(`/campaigns/${project.campaign.id}`)
} else {
response.display("campaign-form", {
user: request.user,
pageTitle: "Campaign - Mantra",
campaign: {
name: `Campaign for ${project.name} project`
},
project: project,
})
}
} else {
next()
}
}).catch(error => {
next(error)
})
})
router.route('/:id/spreadsheet')
.post(function(request, response, next) {
db.Project.findByPk(request.params.id, {
}).then(async (project) => {
if (project) {
db.TranslationEntryVersion.findAll({
include: [
// TODO: require translationEntryVersions in ProjectEntryVersion
{
association: db.TranslationEntryVersion.ProjectTranslationEntryVersions,
where: {
projectId: request.params.id
},
required: true
},
{
association: db.TranslationEntryVersion.EntryVersion,
include: [
{
association: db.EntryVersion.Entry,
include: [
{
association: db.Entry.Dialect
}
]
},
{
association: db.EntryVersion.Chapters,
include: [
{
association: db.Chapter.Chunks,
include: [
{
association: db.Chunk.Translation
}
]
}
]
}
]
},
{
association: db.TranslationEntryVersion.Dialect
}
]
}).then(translationEntryVersions => {
console.log("Translation Entry: ", translationEntryVersions.length)
const workbook = new XL.Workbook();
const cellWidth = 45
const cellHeight = 25
translationEntryVersions.forEach((translationEntryVersion, index) => {
const worksheet_name = `${index+1}-${translationEntryVersion.dialect.countryId}-${translationEntryVersion.dialect.languageId} - ${translationEntryVersion.entryVersion.entry.name}`.substring(0, 30);
// Don't have [ ] * ? : / \
const worksheet = workbook.addWorksheet(worksheet_name.replace(/[`*?:'\[\]\\\/]/gi, ""))
worksheet.cell(2,2,2,3,true)
.string(translationEntryVersion.entryVersion.entry.name)
.style({
font: {
bold: true,
},
alignment: {
wrapText: true
}
})
worksheet.cell(4,2)
.string(translationEntryVersion.entryVersion.entry.dialect.name)
.style({
font: {
bold: true,
},
alignment: {
wrapText: true
}
})
worksheet.cell(4,3)
.string(translationEntryVersion.dialect.name)
.style({
font: {
bold: true,
},
alignment: {
wrapText: true
}
})
var cellIndex = 6
for (const i in translationEntryVersion.entryVersion.chapters) {
const chapter = translationEntryVersion.entryVersion.chapters[i]
const chunks = chapter.chunks.sort((a,b) => a.index - b.index)
for (const j in chunks) {
const chunk = chunks[j]
worksheet.cell(cellIndex,2)
.string(chunk.text)
.style({
alignment: {
wrapText: true,
vertical: 'top'
}
})
worksheet.cell(cellIndex,3)
.string(chunk.translation?.text ?? "")
.style({
alignment: {
wrapText: true,
vertical: 'top'
}
})
const textLength = chunk.text.length
worksheet.row(cellIndex).setHeight(
Math.ceil(Math.max(textLength/cellWidth, 1)*cellHeight)
)
cellIndex++
}
cellIndex++
}
// Format
worksheet.column(2).setWidth(cellWidth);
worksheet.column(3).setWidth(cellWidth);
})
workbook.write(`${project.name}.xlsx`, response);
}).catch(error => {
next(error)
})
} else {
next()
}
})
})
return router;
};