@things-factory/board-service 6.0.49 → 6.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-server/controllers/fonts.js +57 -2
- package/dist-server/controllers/fonts.js.map +1 -1
- package/dist-server/controllers/headless-pool-for-label.js +3 -2
- package/dist-server/controllers/headless-pool-for-label.js.map +1 -1
- package/dist-server/controllers/pdf.js +3 -1
- package/dist-server/controllers/pdf.js.map +1 -1
- package/dist-server/controllers/screenshot.js +3 -1
- package/dist-server/controllers/screenshot.js.map +1 -1
- package/dist-server/routers/board-print-router.js +0 -3
- package/dist-server/routers/board-print-router.js.map +1 -1
- package/dist-server/routers/standalone-board-service-router.js +30 -6
- package/dist-server/routers/standalone-board-service-router.js.map +1 -1
- package/dist-server/service/board/board-mutation.js +3 -0
- package/dist-server/service/board/board-mutation.js.map +1 -1
- package/dist-server/service/board/board-query.js +2 -0
- package/dist-server/service/board/board-query.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/server/controllers/fonts.ts +64 -5
- package/server/controllers/headless-pool-for-label.ts +3 -2
- package/server/controllers/pdf.ts +4 -1
- package/server/controllers/screenshot.ts +4 -1
- package/server/routers/board-print-router.ts +0 -3
- package/server/routers/standalone-board-service-router.ts +43 -7
- package/server/service/board/board-mutation.ts +3 -0
- package/server/service/board/board-query.ts +3 -1
- package/views/internal-board-full-feature-view.html +12 -2
- package/views/internal-board-service-view.html +12 -2
- package/views/internal-label-command-view.html +12 -2
|
@@ -2,10 +2,65 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fonts = void 0;
|
|
4
4
|
const font_base_1 = require("@things-factory/font-base");
|
|
5
|
+
const attachment_base_1 = require("@things-factory/attachment-base");
|
|
5
6
|
const shell_1 = require("@things-factory/shell");
|
|
6
|
-
const fonts = async () => {
|
|
7
|
+
const fonts = async (domain) => {
|
|
7
8
|
const qb = await (0, shell_1.getRepository)(font_base_1.Font).createQueryBuilder('FONT');
|
|
8
|
-
|
|
9
|
+
const fonts = domain
|
|
10
|
+
? await qb
|
|
11
|
+
.select('name')
|
|
12
|
+
.distinct(true)
|
|
13
|
+
.addSelect('provider')
|
|
14
|
+
.addSelect('id')
|
|
15
|
+
.addSelect('uri')
|
|
16
|
+
.where({ domain: { id: domain.id }, active: true })
|
|
17
|
+
.getRawMany()
|
|
18
|
+
: await qb.select('name').distinct(true).where({ active: true }).getRawMany();
|
|
19
|
+
var googleFonts = fonts.filter(({ provider }) => provider == 'google');
|
|
20
|
+
var customFonts = fonts.filter(({ provider }) => provider == 'custom');
|
|
21
|
+
var customFontCSS = '';
|
|
22
|
+
for (const font of customFonts) {
|
|
23
|
+
var files = domain
|
|
24
|
+
? await (0, shell_1.getRepository)(attachment_base_1.Attachment).findBy({
|
|
25
|
+
domain: { id: domain.id },
|
|
26
|
+
refBy: font.id
|
|
27
|
+
})
|
|
28
|
+
: await (0, shell_1.getRepository)(attachment_base_1.Attachment).findBy({
|
|
29
|
+
refBy: font.id
|
|
30
|
+
});
|
|
31
|
+
if (files && files.length > 0) {
|
|
32
|
+
customFontCSS += files
|
|
33
|
+
.map(file => {
|
|
34
|
+
const { name: filename, fullpath } = file;
|
|
35
|
+
const bold = filename.toUpperCase().indexOf('BOLD') !== -1;
|
|
36
|
+
return `@font-face {
|
|
37
|
+
font-family: '${font.name}';
|
|
38
|
+
src: local('${font.name}'), url(${fullpath});
|
|
39
|
+
font-weight: ${bold ? 'bold' : 'normal'};
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
})
|
|
43
|
+
.join('\n');
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
customFontCSS += `@font-face {
|
|
47
|
+
font-family: '${font.name}';
|
|
48
|
+
src: local('${font.name}')${font.uri ? `, url(${font.uri})` : ''};
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return [
|
|
54
|
+
{
|
|
55
|
+
google: {
|
|
56
|
+
families: googleFonts.map(({ name }) => name)
|
|
57
|
+
},
|
|
58
|
+
custom: {
|
|
59
|
+
families: customFonts.map(({ name }) => name)
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
customFontCSS
|
|
63
|
+
];
|
|
9
64
|
};
|
|
10
65
|
exports.fonts = fonts;
|
|
11
66
|
//# sourceMappingURL=fonts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../server/controllers/fonts.ts"],"names":[],"mappings":";;;AAEA,yDAAgD;AAChD,
|
|
1
|
+
{"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../server/controllers/fonts.ts"],"names":[],"mappings":"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","sourcesContent":["import { SelectQueryBuilder } from 'typeorm'\n\nimport { Font } from '@things-factory/font-base'\nimport { Attachment } from '@things-factory/attachment-base'\nimport { getRepository, Domain } from '@things-factory/shell'\n\nexport const fonts = async (domain?: Domain) => {\n const qb: SelectQueryBuilder<Font> = await getRepository(Font).createQueryBuilder('FONT')\n\n const fonts = domain\n ? await qb\n .select('name')\n .distinct(true)\n .addSelect('provider')\n .addSelect('id')\n .addSelect('uri')\n .where({ domain: { id: domain.id }, active: true })\n .getRawMany()\n : await qb.select('name').distinct(true).where({ active: true }).getRawMany()\n\n var googleFonts = fonts.filter(({ provider }) => provider == 'google')\n var customFonts = fonts.filter(({ provider }) => provider == 'custom')\n\n var customFontCSS: string = ''\n\n for (const font of customFonts) {\n var files: Attachment = domain\n ? await getRepository(Attachment).findBy({\n domain: { id: domain.id },\n refBy: font.id\n })\n : await getRepository(Attachment).findBy({\n refBy: font.id\n })\n\n if (files && files.length > 0) {\n customFontCSS += files\n .map(file => {\n const { name: filename, fullpath } = file\n const bold = filename.toUpperCase().indexOf('BOLD') !== -1\n\n return `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}'), url(${fullpath});\n font-weight: ${bold ? 'bold' : 'normal'};\n }\n `\n })\n .join('\\n')\n } else {\n customFontCSS += `@font-face {\n font-family: '${font.name}';\n src: local('${font.name}')${font.uri ? `, url(${font.uri})` : ''};\n }\n `\n }\n }\n\n return [\n {\n google: {\n families: googleFonts.map(({ name }) => name)\n },\n custom: {\n families: customFonts.map(({ name }) => name)\n }\n },\n customFontCSS\n ]\n}\n"]}
|
|
@@ -99,7 +99,7 @@ async function initializeScenePage() {
|
|
|
99
99
|
const port = process.env.PORT;
|
|
100
100
|
const url = `${protocol}://${host}:${port}${path}`;
|
|
101
101
|
const page = await browser.newPage();
|
|
102
|
-
const fontsToUse = await (0, fonts_1.fonts)();
|
|
102
|
+
const [fontsToUse, fontStyles] = await (0, fonts_1.fonts)();
|
|
103
103
|
await page.setRequestInterception(true);
|
|
104
104
|
page.on('console', msg => {
|
|
105
105
|
console.log(`[browser ${msg.type()}] ${msg.text()}`);
|
|
@@ -114,7 +114,8 @@ async function initializeScenePage() {
|
|
|
114
114
|
'Content-Type': 'application/json'
|
|
115
115
|
},
|
|
116
116
|
postData: JSON.stringify({
|
|
117
|
-
fonts: fontsToUse
|
|
117
|
+
fonts: fontsToUse,
|
|
118
|
+
fontStyles
|
|
118
119
|
})
|
|
119
120
|
});
|
|
120
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"headless-pool-for-label.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-label.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"headless-pool-for-label.js","sourceRoot":"","sources":["../../server/controllers/headless-pool-for-label.ts"],"names":[],"mappings":"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","sourcesContent":["import * as genericPool from 'generic-pool'\n\nimport { config, logger } from '@things-factory/env'\nimport { pubsub } from '@things-factory/shell'\n\nimport { fonts } from './fonts'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nvar headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = genericPool.createPool(\n {\n create() {\n console.log('headless-pool-for-label about to create')\n return initializeScenePage()\n },\n validate({ browser, page }) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(_ => true)\n .catch(_ => false)\n ])\n },\n destroy({ browser, page }) {\n //@ts-ignore\n return browser.close()\n }\n },\n {\n min: 2,\n max: 10,\n testOnBorrow: true,\n acquireTimeoutMillis: 15000\n }\n )\n\n setTimeout(async () => {\n const it = pubsub.asyncIterator('notify-font-changed')\n for await (const data of it) {\n headlessPool.clear()\n }\n })\n }\n\n return headlessPool\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n var launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox']\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n\nasync function initializeScenePage() {\n /* get brand new browser for every request */\n const browser = await initializeChromium()\n\n if (!browser) {\n return\n }\n\n const protocol = 'http'\n const host = 'localhost'\n const path = '/internal-label-command-view'\n\n const port = process.env.PORT\n const url = `${protocol}://${host}:${port}${path}`\n\n const page = await browser.newPage()\n const [fontsToUse, fontStyles] = await fonts()\n\n await page.setRequestInterception(true)\n page.on('console', msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n for (let i = 0; i < msg.args().length; ++i) console.log(`${i}: ${msg.args()[i]}`)\n })\n\n page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n postData: JSON.stringify({\n fonts: fontsToUse,\n fontStyles\n })\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url, { timeout: 0, waitUntil: 'load' })\n\n return { browser, page }\n}\n"]}
|
|
@@ -14,7 +14,9 @@ const pdf = async ({ id = '', model = null, data = null, width: w = 0, height: h
|
|
|
14
14
|
}
|
|
15
15
|
const { domain, user } = context.state;
|
|
16
16
|
var { model, base } = await (0, headless_model_1.headlessModel)({ domain, id, model });
|
|
17
|
-
|
|
17
|
+
const [fontsToUse, fontStyles] = await (0, fonts_1.fonts)(domain);
|
|
18
|
+
model.fonts = fontsToUse;
|
|
19
|
+
model.fontStyles = fontStyles;
|
|
18
20
|
let { width, height } = model;
|
|
19
21
|
width = Number(width);
|
|
20
22
|
height = Number(height);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../server/controllers/pdf.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAC/B,uEAA2D;AAC3D,qDAAgD;AAEhD,MAAM,QAAQ,GAAG,MAAM,CAAA;AACvB,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,IAAI,GAAG,8BAA8B,CAAA;AAEpC,MAAM,GAAG,GAAG,KAAK,EAAE,EACxB,EAAE,GAAG,EAAE,EACP,KAAK,GAAG,IAAI,EACZ,IAAI,GAAG,IAAI,EACX,KAAK,EAAE,CAAC,GAAG,CAAC,EACZ,MAAM,EAAE,CAAC,GAAG,CAAC,EACb,OAAO,GAAG,EAAS,EACnB,OAAO,GAAG,EAAS,KACjB,EAAE,EAAE,EAAE;IACR,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,yCAAe,GAAE,CAAC,OAAO,EAAE,CAAQ,CAAA;IAE1D,IAAI,CAAC,OAAO,EAAE;QACZ,OAAM;KACP;IAED,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEtC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,8BAAa,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAChE,
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../server/controllers/pdf.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const pdf = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = {} as any,\n context = {} as any\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n\n if (!browser) {\n return\n }\n\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n let { width, height } = model\n\n width = Number(width)\n height = Number(height)\n\n if (!w) {\n w = width\n }\n if (!h) {\n h = height\n }\n\n let ratio = Math.min(w / width, h / height)\n\n width = Math.floor(width * ratio)\n height = Math.floor(height * ratio)\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n const page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\n await page.setRequestInterception(true)\n\n page.on('console', msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n for (let i = 0; i < msg.args().length; ++i) console.log(`${i}: ${msg.args()[i]}`)\n })\n\n const token = await user?.sign() // TODO improve performance\n\n page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n },\n postData: JSON.stringify({\n model,\n base\n })\n })\n } else if (request.url().startsWith(`${protocol}://${host}${port}`)) {\n request.continue({\n headers: {\n ...request.headers(),\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n }\n })\n } else {\n request.continue()\n }\n })\n\n await page.goto(url)\n\n await page.evaluate(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n const pdf = await page.pdf({\n format: 'A4',\n ...options\n })\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return pdf\n}\n"]}
|
|
@@ -15,7 +15,9 @@ const screenshot = async ({ id = '', model = null, data = null, width: w = 0, he
|
|
|
15
15
|
}
|
|
16
16
|
const { domain, user } = context.state;
|
|
17
17
|
var { model, base } = await (0, headless_model_1.headlessModel)({ domain, id, model });
|
|
18
|
-
|
|
18
|
+
const [fontsToUse, fontStyles] = await (0, fonts_1.fonts)(domain);
|
|
19
|
+
model.fonts = fontsToUse;
|
|
20
|
+
model.fontStyles = fontStyles;
|
|
19
21
|
var { width, height } = model;
|
|
20
22
|
if (isThumbnail) {
|
|
21
23
|
var widthRatio = 400 / width, heightRatio = 300 / height;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../server/controllers/screenshot.ts"],"names":[],"mappings":";;;AAAA,mCAA+B;AAC/B,uEAA2D;AAC3D,qDAAgD;AAEhD,MAAM,QAAQ,GAAG,MAAM,CAAA;AACvB,MAAM,IAAI,GAAG,WAAW,CAAA;AACxB,MAAM,IAAI,GAAG,8BAA8B,CAAA;AAEpC,MAAM,UAAU,GAAG,KAAK,EAAE,EAC/B,EAAE,GAAG,EAAE,EACP,KAAK,GAAG,IAAI,EACZ,IAAI,GAAG,IAAI,EACX,KAAK,EAAE,CAAC,GAAG,CAAC,EACZ,MAAM,EAAE,CAAC,GAAG,CAAC,EACb,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAS,EACvC,WAAW,GAAG,KAAK,EACnB,OAAO,GAAG,EAAS,KACjB,EAAE,EAAE,EAAE;IACR,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,yCAAe,GAAE,CAAC,OAAO,EAAE,CAAQ,CAAA;IAC1D,IAAI,UAAU,GAAG,IAAI,CAAA;IAErB,IAAI,CAAC,OAAO,EAAE;QACZ,OAAM;KACP;IACD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;IAEtC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,8BAAa,EAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAChE,
|
|
1
|
+
{"version":3,"file":"screenshot.js","sourceRoot":"","sources":["../../server/controllers/screenshot.ts"],"names":[],"mappings":"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","sourcesContent":["import { fonts } from './fonts'\nimport { getHeadlessPool } from './headless-pool-for-board'\nimport { headlessModel } from './headless-model'\n\nconst protocol = 'http'\nconst host = 'localhost'\nconst path = '/internal-board-service-view'\n\nexport const screenshot = async ({\n id = '',\n model = null,\n data = null,\n width: w = 0,\n height: h = 0,\n options = { encoding: 'base64' } as any,\n isThumbnail = false,\n context = {} as any\n} = {}) => {\n const browser = (await getHeadlessPool().acquire()) as any\n var screenshot = null\n\n if (!browser) {\n return\n }\n const { domain, user } = context.state\n\n var { model, base } = await headlessModel({ domain, id, model })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n var { width, height } = model\n\n if (isThumbnail) {\n var widthRatio = 400 / width,\n heightRatio = 300 / height\n var ratio = widthRatio < heightRatio ? widthRatio : heightRatio\n width = width * ratio\n height = height * ratio\n }\n width = Math.floor(w || Number(width))\n height = Math.floor(h || Number(height))\n\n const port = process.env.PORT ? `:${process.env.PORT}` : ''\n const url = `${protocol}://${host}${port}${path}`\n\n var page = await browser.newPage()\n\n try {\n /* @remember-me width, height should be a integer */\n await page.setViewport({ width, height })\n await page.setRequestInterception(true)\n await page.setDefaultTimeout(5000)\n\n page.on('console', msg => {\n console.log(`[browser ${msg.type()}] ${msg.text()}`)\n for (let i = 0; i < msg.args().length; ++i) console.log(`${i}: ${msg.args()[i]}`)\n })\n\n const token = await user?.sign() // TODO improve performance\n\n page.on('request', request => {\n if (request.url() === url) {\n request.continue({\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n },\n postData: JSON.stringify({\n model,\n base\n })\n })\n } else if (request.url().startsWith(`${protocol}://${host}${port}`)) {\n request.continue({\n headers: {\n ...request.headers(),\n 'x-things-factory-domain': domain?.subdomain,\n Authorization: 'Bearer ' + token\n }\n })\n } else {\n request.continue()\n }\n })\n await page.goto(url)\n\n await page.evaluate(async data => {\n if (data) {\n // @ts-ignore\n s.data = data\n }\n\n // data 주입 후 강제 지연시킴.\n return new Promise(resolve => {\n // @ts-ignore\n requestAnimationFrame(() => resolve())\n })\n }, data)\n\n screenshot = await page.screenshot(options)\n } catch (error) {\n console.log(error)\n } finally {\n page.close()\n getHeadlessPool().release(browser)\n }\n\n return screenshot\n}\n"]}
|
|
@@ -10,7 +10,6 @@ exports.boardPrintRouter = new koa_router_1.default();
|
|
|
10
10
|
* ?printerId=printer_id&data=grf_string
|
|
11
11
|
*/
|
|
12
12
|
exports.boardPrintRouter.get('/print', async (context, next) => {
|
|
13
|
-
const { domain } = context.state;
|
|
14
13
|
let data = Object.keys(context.query).length ? context.query : null;
|
|
15
14
|
context.body = await (0, print_1.printDirect)(data.printerId, data.data);
|
|
16
15
|
});
|
|
@@ -18,13 +17,11 @@ exports.boardPrintRouter.get('/print', async (context, next) => {
|
|
|
18
17
|
* { printerId: 'printer driver ID', data: 'grf string' }
|
|
19
18
|
*/
|
|
20
19
|
exports.boardPrintRouter.post('/print', async (context, next) => {
|
|
21
|
-
const { domain } = context.state;
|
|
22
20
|
let params = context.request.body;
|
|
23
21
|
context.type = 'text/plain';
|
|
24
22
|
context.body = await (0, print_1.printDirect)(params.printerId, params.data);
|
|
25
23
|
});
|
|
26
24
|
exports.boardPrintRouter.get('/print-label/:id', async (context, next) => {
|
|
27
|
-
const { domain } = context.state;
|
|
28
25
|
const { id } = context.params;
|
|
29
26
|
let data = Object.keys(context.query).length ? context.query : null;
|
|
30
27
|
let orientation = data && data.orientation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-print-router.js","sourceRoot":"","sources":["../../server/routers/board-print-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAE/B,gEAA2D;AAC3D,gDAAkD;AAErC,QAAA,gBAAgB,GAAG,IAAI,oBAAM,EAAE,CAAA;AAE5C;;GAEG;AACH,wBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrD,
|
|
1
|
+
{"version":3,"file":"board-print-router.js","sourceRoot":"","sources":["../../server/routers/board-print-router.ts"],"names":[],"mappings":";;;;AAAA,oEAA+B;AAE/B,gEAA2D;AAC3D,gDAAkD;AAErC,QAAA,gBAAgB,GAAG,IAAI,oBAAM,EAAE,CAAA;AAE5C;;GAEG;AACH,wBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACrD,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAEnE,OAAO,CAAC,IAAI,GAAG,MAAM,IAAA,mBAAW,EAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;AAC7D,CAAC,CAAC,CAAA;AAEF;;GAEG;AACH,wBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IACtD,IAAI,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAA;IAEjC,OAAO,CAAC,IAAI,GAAG,YAAY,CAAA;IAC3B,OAAO,CAAC,IAAI,GAAG,MAAM,IAAA,mBAAW,EAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;AACjE,CAAC,CAAC,CAAA;AAEF,wBAAgB,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;IAC/D,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;IAC7B,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAEnE,IAAI,WAAW,GAAG,IAAI,IAAI,IAAI,CAAC,WAAW,CAAA;IAC1C,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAA;IAChC,IAAI,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,UAAU,CAAA;IACxC,IAAI,GAAG,GAAG,MAAM,IAAA,4BAAY,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAS,CAAC,CAAA;IAE3F,OAAO,CAAC,IAAI,GAAG,YAAY,CAAA;IAC3B,YAAY;IACZ,OAAO,CAAC,IAAI,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;AACjD,CAAC,CAAC,CAAA","sourcesContent":["import Router from 'koa-router'\n\nimport { labelcommand } from '../controllers/label-command'\nimport { printDirect } from '../controllers/print'\n\nexport const boardPrintRouter = new Router()\n\n/**\n * ?printerId=printer_id&data=grf_string\n */\nboardPrintRouter.get('/print', async (context, next) => {\n let data = Object.keys(context.query).length ? context.query : null\n\n context.body = await printDirect(data.printerId, data.data)\n})\n\n/**\n * { printerId: 'printer driver ID', data: 'grf string' }\n */\nboardPrintRouter.post('/print', async (context, next) => {\n let params = context.request.body\n\n context.type = 'text/plain'\n context.body = await printDirect(params.printerId, params.data)\n})\n\nboardPrintRouter.get('/print-label/:id', async (context, next) => {\n const { id } = context.params\n let data = Object.keys(context.query).length ? context.query : null\n\n let orientation = data && data.orientation\n let mirror = data && data.mirror\n let upsideDown = data && data.upsideDown\n let grf = await labelcommand({ id, data, orientation, mirror, upsideDown, context } as any)\n\n context.type = 'text/plain'\n // TODO: 동기화\n context.body = printDirect(data.printerId, grf)\n})\n"]}
|
|
@@ -13,27 +13,43 @@ const pdf_1 = require("../controllers/pdf");
|
|
|
13
13
|
const screenshot_1 = require("../controllers/screenshot");
|
|
14
14
|
const board_1 = require("../service/board/board");
|
|
15
15
|
exports.standaloneBoardServiceRouter = new koa_router_1.default();
|
|
16
|
-
// for board headless
|
|
16
|
+
// for board headless-full
|
|
17
17
|
exports.standaloneBoardServiceRouter.get('/headless-full/:id', async (context, next) => {
|
|
18
18
|
const { domain, user } = context.state;
|
|
19
|
+
if (!(await auth_base_1.User.hasPrivilege('query', 'board', domain, user))) {
|
|
20
|
+
context.status = 403;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
19
23
|
const { id } = context.params;
|
|
20
24
|
const { model, base } = await (0, headless_model_1.headlessModel)({ domain, id });
|
|
21
|
-
|
|
25
|
+
const [fontsToUse, fontStyles] = await (0, fonts_1.fonts)(domain);
|
|
26
|
+
model.fonts = fontsToUse;
|
|
27
|
+
model.fontStyles = fontStyles;
|
|
22
28
|
(0, auth_base_1.setAccessTokenCookie)(context, await user.sign({ domain }));
|
|
23
29
|
await context.render('internal-board-full-feature-view', { model, base });
|
|
24
30
|
});
|
|
25
31
|
// for board headless
|
|
26
32
|
exports.standaloneBoardServiceRouter.get('/headless/:id', async (context, next) => {
|
|
27
33
|
const { domain, user } = context.state;
|
|
34
|
+
if (!(await auth_base_1.User.hasPrivilege('query', 'board', domain, user))) {
|
|
35
|
+
context.status = 403;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
28
38
|
const { id } = context.params;
|
|
29
39
|
const { model, base } = await (0, headless_model_1.headlessModel)({ domain, id });
|
|
30
|
-
|
|
40
|
+
const [fontsToUse, fontStyles] = await (0, fonts_1.fonts)(domain);
|
|
41
|
+
model.fonts = fontsToUse;
|
|
42
|
+
model.fontStyles = fontStyles;
|
|
31
43
|
(0, auth_base_1.setAccessTokenCookie)(context, await user.sign({ domain }));
|
|
32
44
|
await context.render('internal-board-service-view', { model, base });
|
|
33
45
|
});
|
|
34
46
|
// for board thumbnail
|
|
35
47
|
exports.standaloneBoardServiceRouter.get('/thumbnail/:id', async (context, next) => {
|
|
36
|
-
const { domain } = context.state;
|
|
48
|
+
const { domain, user } = context.state;
|
|
49
|
+
if (!(await auth_base_1.User.hasPrivilege('query', 'board', domain, user))) {
|
|
50
|
+
context.status = 403;
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
37
53
|
const { id } = context.params;
|
|
38
54
|
const { name, thumbnail } = (await (0, shell_1.getRepository)(board_1.Board).findOneBy({ domain: { id: domain.id }, id })) || {};
|
|
39
55
|
if (thumbnail) {
|
|
@@ -50,7 +66,11 @@ exports.standaloneBoardServiceRouter.get('/thumbnail/:id', async (context, next)
|
|
|
50
66
|
});
|
|
51
67
|
// for webpage scrap
|
|
52
68
|
exports.standaloneBoardServiceRouter.get('/screenshot/:id', async (context, next) => {
|
|
53
|
-
const { domain } = context.state;
|
|
69
|
+
const { domain, user } = context.state;
|
|
70
|
+
if (!(await auth_base_1.User.hasPrivilege('query', 'board', domain, user))) {
|
|
71
|
+
context.status = 403;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
54
74
|
const { id } = context.params;
|
|
55
75
|
const { model, board } = await (0, headless_model_1.headlessModel)({ domain, id });
|
|
56
76
|
const data = Object.keys(context.query).length ? context.query : null;
|
|
@@ -60,7 +80,11 @@ exports.standaloneBoardServiceRouter.get('/screenshot/:id', async (context, next
|
|
|
60
80
|
});
|
|
61
81
|
// for webpage scrap
|
|
62
82
|
exports.standaloneBoardServiceRouter.get('/board/pdf/:id', async (context, next) => {
|
|
63
|
-
const { domain } = context.state;
|
|
83
|
+
const { domain, user } = context.state;
|
|
84
|
+
if (!(await auth_base_1.User.hasPrivilege('query', 'board', domain, user))) {
|
|
85
|
+
context.status = 403;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
64
88
|
const { id } = context.params;
|
|
65
89
|
const { model, board } = await (0, headless_model_1.headlessModel)({ domain, id });
|
|
66
90
|
const data = Object.keys(context.query).length ? context.query : null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standalone-board-service-router.js","sourceRoot":"","sources":["../../server/routers/standalone-board-service-router.ts"],"names":[],"mappings":";;;;AAAA,sFAAoD;AACpD,oEAA+B;AAE/B,
|
|
1
|
+
{"version":3,"file":"standalone-board-service-router.js","sourceRoot":"","sources":["../../server/routers/standalone-board-service-router.ts"],"names":[],"mappings":"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","sourcesContent":["import contentDisposition from 'content-disposition'\nimport Router from 'koa-router'\n\nimport { User, setAccessTokenCookie } from '@things-factory/auth-base'\nimport { getRepository } from '@things-factory/shell'\n\nimport { fonts } from '../controllers/fonts'\nimport { headlessModel } from '../controllers/headless-model'\nimport { labelcommand } from '../controllers/label-command'\nimport { pdf } from '../controllers/pdf'\nimport { screenshot } from '../controllers/screenshot'\nimport { Board } from '../service/board/board'\n\nexport const standaloneBoardServiceRouter = new Router()\n\n// for board headless-full\nstandaloneBoardServiceRouter.get('/headless-full/:id', async (context, next) => {\n const { domain, user } = context.state\n\n if (!(await User.hasPrivilege('query', 'board', domain, user))) {\n context.status = 403\n return\n }\n\n const { id } = context.params\n\n const { model, base } = await headlessModel({ domain, id })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n setAccessTokenCookie(context, await user.sign({ domain }))\n\n await context.render('internal-board-full-feature-view', { model, base })\n})\n\n// for board headless\nstandaloneBoardServiceRouter.get('/headless/:id', async (context, next) => {\n const { domain, user } = context.state\n\n if (!(await User.hasPrivilege('query', 'board', domain, user))) {\n context.status = 403\n return\n }\n\n const { id } = context.params\n\n const { model, base } = await headlessModel({ domain, id })\n const [fontsToUse, fontStyles] = await fonts(domain)\n\n model.fonts = fontsToUse\n model.fontStyles = fontStyles\n\n setAccessTokenCookie(context, await user.sign({ domain }))\n\n await context.render('internal-board-service-view', { model, base })\n})\n\n// for board thumbnail\nstandaloneBoardServiceRouter.get('/thumbnail/:id', async (context, next) => {\n const { domain, user } = context.state\n\n if (!(await User.hasPrivilege('query', 'board', domain, user))) {\n context.status = 403\n return\n }\n\n const { id } = context.params\n\n const { name, thumbnail } = (await getRepository(Board).findOneBy({ domain: { id: domain.id }, id })) || {}\n\n if (thumbnail) {\n const index = thumbnail.indexOf(';base64,')\n const base64 = thumbnail.substring(index + 8)\n const buffer = Buffer.from(base64, 'base64')\n\n context.type = 'image/png'\n context.set('Content-Disposition', contentDisposition(`thumbnail-${name}.png`))\n context.body = buffer\n } else {\n context.throw(404, 'thumbnail not found')\n }\n})\n\n// for webpage scrap\nstandaloneBoardServiceRouter.get('/screenshot/:id', async (context, next) => {\n const { domain, user } = context.state\n\n if (!(await User.hasPrivilege('query', 'board', domain, user))) {\n context.status = 403\n return\n }\n\n const { id } = context.params\n\n const { model, board } = await headlessModel({ domain, id })\n const data = Object.keys(context.query).length ? context.query : null\n\n context.type = 'image/png'\n context.set('Content-Disposition', contentDisposition(`${board.name}.png`))\n context.body = await screenshot({ id, model, data, options: { encoding: 'binary', type: 'png' }, context })\n})\n\n// for webpage scrap\nstandaloneBoardServiceRouter.get('/board/pdf/:id', async (context, next) => {\n const { domain, user } = context.state\n\n if (!(await User.hasPrivilege('query', 'board', domain, user))) {\n context.status = 403\n return\n }\n\n const { id } = context.params\n\n const { model, board } = await headlessModel({ domain, id })\n const data = Object.keys(context.query).length ? context.query : null\n\n const result = await pdf({\n id,\n model,\n data,\n options: {\n format: 'A4'\n },\n context\n })\n\n context.type = 'application/pdf'\n context.set('Content-Disposition', contentDisposition(`${board.name}.pdf`))\n context.body = result\n})\n\n// for webpage scrap => zpl image print(grf format) command\nstandaloneBoardServiceRouter.get('/label-command/:id', async (context, next) => {\n const { id } = context.params\n\n const data = Object.keys(context.query).length ? context.query : null\n\n const orientation = data && data.orientation\n const mirror = data && data.mirror\n const upsideDown = data && data.upsideDown\n\n context.type = 'text/plain'\n context.body = await labelcommand({ id, data, orientation, mirror, upsideDown, context } as any)\n})\n"]}
|
|
@@ -98,6 +98,7 @@ let BoardMutation = class BoardMutation {
|
|
|
98
98
|
};
|
|
99
99
|
tslib_1.__decorate([
|
|
100
100
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
101
|
+
(0, type_graphql_1.Directive)('@privilege(category: "board", privilege: "mutation", domainOwnerGranted: true)'),
|
|
101
102
|
(0, type_graphql_1.Mutation)(returns => board_1.Board, { description: 'To create new Board' }),
|
|
102
103
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('board')),
|
|
103
104
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
@@ -107,6 +108,7 @@ tslib_1.__decorate([
|
|
|
107
108
|
], BoardMutation.prototype, "createBoard", null);
|
|
108
109
|
tslib_1.__decorate([
|
|
109
110
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
111
|
+
(0, type_graphql_1.Directive)('@privilege(category: "board", privilege: "mutation", domainOwnerGranted: true)'),
|
|
110
112
|
(0, type_graphql_1.Mutation)(returns => board_1.Board, { description: 'To modify Board information' }),
|
|
111
113
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
|
112
114
|
tslib_1.__param(1, (0, type_graphql_1.Arg)('patch')),
|
|
@@ -117,6 +119,7 @@ tslib_1.__decorate([
|
|
|
117
119
|
], BoardMutation.prototype, "updateBoard", null);
|
|
118
120
|
tslib_1.__decorate([
|
|
119
121
|
(0, type_graphql_1.Directive)('@transaction'),
|
|
122
|
+
(0, type_graphql_1.Directive)('@privilege(category: "board", privilege: "mutation", domainOwnerGranted: true)'),
|
|
120
123
|
(0, type_graphql_1.Mutation)(returns => Boolean, { description: 'To delete Board' }),
|
|
121
124
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
|
122
125
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-mutation.js","sourceRoot":"","sources":["../../../server/service/board/board-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,iDAAgE;AAEhE,2DAAuD;AACvD,0CAAsC;AACtC,mCAA+B;AAC/B,6CAAmD;AAG5C,IAAM,aAAa,GAAnB,MAAM,aAAa;
|
|
1
|
+
{"version":3,"file":"board-mutation.js","sourceRoot":"","sources":["../../../server/service/board/board-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Ctx, Mutation, Resolver, Directive } from 'type-graphql'\nimport { getRedirectSubdomainPath } from '@things-factory/shell'\n\nimport { thumbnail } from '../../controllers/thumbnail'\nimport { Group } from '../group/group'\nimport { Board } from './board'\nimport { BoardPatch, NewBoard } from './board-type'\n\n@Resolver(Board)\nexport class BoardMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"board\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Board, { description: 'To create new Board' })\n async createBoard(@Arg('board') board: NewBoard, @Ctx() context: ResolverContext): Promise<Board> {\n const { domain, user, notify, tx } = context.state\n const repository = tx.getRepository(Board)\n const groupRepository = tx.getRepository(Group)\n\n const oldBoard: Board = await repository.findOneBy({\n name: board.name,\n domain: { id: domain.id }\n })\n\n if (oldBoard) {\n throw new Error(context.t('error.board name is already taken', { name: board.name }))\n }\n\n const newBoard: Board = {\n ...board\n }\n\n if (board.groupId) {\n newBoard.group = await groupRepository.findOneBy({\n id: board.groupId\n })\n }\n\n const base64 = await thumbnail({\n model: board.model,\n context\n })\n\n if (base64) {\n newBoard.thumbnail = 'data:image/png;base64,' + base64.toString('base64')\n } else {\n newBoard.thumbnail = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n }\n\n const created = await repository.save({\n domain,\n ...newBoard,\n creator: user,\n updater: user\n })\n\n notify &&\n notify({\n mode: 'in-app',\n title: `Board '${created.name}' created`,\n body: `Board '${created.name}' created by ${user.name}\\n${created.description}`,\n url: getRedirectSubdomainPath(context, domain.subdomain, `/board-viewer/${created.id}`)\n })\n\n return created\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"board\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Board, { description: 'To modify Board information' })\n async updateBoard(\n @Arg('id') id: string,\n @Arg('patch') patch: BoardPatch,\n @Ctx() context: ResolverContext\n ): Promise<Board> {\n const { domain, user, notify, tx } = context.state\n const repository = tx.getRepository(Board)\n\n const board = await repository.findOneBy({ domain: { id: domain.id }, id })\n\n if (patch.model) {\n const base64 = await thumbnail({\n model: patch.model,\n context\n })\n\n if (base64) {\n patch.thumbnail = 'data:image/png;base64,' + base64.toString('base64')\n } else {\n patch.thumbnail = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n }\n }\n\n if (patch.groupId !== undefined) {\n const groupRepository = tx.getRepository(Group)\n board.group =\n (await groupRepository.findOneBy({\n domain: { id: domain.id },\n id: patch.groupId\n })) || null\n\n delete patch.groupId\n }\n\n const updated = await repository.save({\n ...board,\n ...patch,\n updater: user\n })\n\n notify &&\n notify({\n mode: 'in-app',\n title: `Board '${updated.name}' updated`,\n body: `Board '${updated.name}' updated by ${user.name}\\n${updated.description}`,\n image: getRedirectSubdomainPath(context, domain.subdomain, `/thumbnail/${updated.id}`),\n url: getRedirectSubdomainPath(context, domain.subdomain, `/board-viewer/${updated.id}`)\n })\n\n return updated\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"board\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete Board' })\n async deleteBoard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, notify, tx } = context.state\n const repository = tx.getRepository(Board)\n const board = await repository.findOneBy({ domain: { id: domain.id }, id })\n\n const deleted = await repository.delete(id)\n\n notify &&\n notify({\n mode: 'in-app',\n title: `Board '${board.name}' deleted`,\n body: `Board '${board.name}' deleted by ${user.name}\\n${board.description}`\n })\n\n return true\n }\n}\n"]}
|
|
@@ -73,6 +73,7 @@ let BoardQuery = class BoardQuery {
|
|
|
73
73
|
};
|
|
74
74
|
tslib_1.__decorate([
|
|
75
75
|
(0, type_graphql_1.Query)(returns => board_1.Board, { description: 'To fetch a Board' }),
|
|
76
|
+
(0, type_graphql_1.Directive)('@privilege(category: "board", privilege: "query")'),
|
|
76
77
|
tslib_1.__param(0, (0, type_graphql_1.Arg)('id')),
|
|
77
78
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
78
79
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -89,6 +90,7 @@ tslib_1.__decorate([
|
|
|
89
90
|
], BoardQuery.prototype, "boardsCreatedByMe", null);
|
|
90
91
|
tslib_1.__decorate([
|
|
91
92
|
(0, type_graphql_1.Query)(returns => board_type_1.BoardList, { description: 'To fetch multiple Boards' }),
|
|
93
|
+
(0, type_graphql_1.Directive)('@privilege(category: "board", privilege: "query")'),
|
|
92
94
|
tslib_1.__param(0, (0, type_graphql_1.Args)()),
|
|
93
95
|
tslib_1.__param(1, (0, type_graphql_1.Ctx)()),
|
|
94
96
|
tslib_1.__metadata("design:type", Function),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-query.js","sourceRoot":"","sources":["../../../server/service/board/board-query.ts"],"names":[],"mappings":";;;;AAAA,+
|
|
1
|
+
{"version":3,"file":"board-query.js","sourceRoot":"","sources":["../../../server/service/board/board-query.ts"],"names":[],"mappings":"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","sourcesContent":["import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root, Directive } from 'type-graphql'\n\nimport { User } from '@things-factory/auth-base'\nimport { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'\n\nimport { Group } from '../group/group'\nimport { PlayGroup } from '../play-group/play-group'\nimport { Board } from './board'\nimport { BoardList } from './board-type'\n\n@Resolver(Board)\nexport class BoardQuery {\n @Query(returns => Board, { description: 'To fetch a Board' })\n @Directive('@privilege(category: \"board\", privilege: \"query\")')\n async board(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Board> {\n const { domain } = context.state\n\n return await getRepository(Board).findOne({\n where: { domain: { id: domain.id }, id }\n })\n }\n\n @Query(returns => BoardList, { description: 'To fetch Boards created by me' })\n async boardsCreatedByMe(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<BoardList> {\n const { domain, user } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(Board),\n params,\n domain,\n alias: 'board',\n searchables: ['name', 'description']\n }).andWhere('board.creator = :user', { user: user.id })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @Query(returns => BoardList, { description: 'To fetch multiple Boards' })\n @Directive('@privilege(category: \"board\", privilege: \"query\")')\n async boards(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<BoardList> {\n const { domain } = context.state\n\n const queryBuilder = getQueryBuilderFromListParams({\n repository: getRepository(Board),\n params,\n domain,\n searchables: ['name', 'description']\n })\n\n const [items, total] = await queryBuilder.getManyAndCount()\n\n return { items, total }\n }\n\n @FieldResolver(type => Group)\n async group(@Root() board: Board) {\n return (\n board.groupId &&\n (await getRepository(Group).findOneBy({\n id: board.groupId\n }))\n )\n }\n\n @FieldResolver(type => [PlayGroup])\n async playGroups(@Root() board: Board) {\n return (\n await getRepository(Board).findOne({\n where: { id: board.id },\n relations: ['playGroups']\n })\n )?.playGroups\n }\n\n @FieldResolver(type => Domain)\n async domain(@Root() board: Board) {\n return (\n board.domainId &&\n (await getRepository(Domain).findOneBy({\n id: board.domainId\n }))\n )\n }\n\n @FieldResolver(type => User)\n async updater(@Root() board: Board): Promise<User> {\n return (\n board.updaterId &&\n (await getRepository(User).findOneBy({\n id: board.updaterId\n }))\n )\n }\n\n @FieldResolver(type => User)\n async creator(@Root() board: Board): Promise<User> {\n return (\n board.creatorId &&\n (await getRepository(User).findOneBy({\n id: board.creatorId\n }))\n )\n }\n}\n"]}
|