initial commit
37
.gitignore
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.js
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
.idea
|
||||
26
index.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import express from 'express';
|
||||
import cors from 'cors';
|
||||
import * as path from 'path';
|
||||
import apiRouter from './src/api';
|
||||
import bodyParser from 'body-parser';
|
||||
|
||||
const app = express();
|
||||
const port = 5000;
|
||||
|
||||
app.use(cors())
|
||||
app.use('/static', express.static(path.join(__dirname, 'static')))
|
||||
// app.use(express.static(path.join(__dirname, 'static')))
|
||||
// @ts-ignore
|
||||
app.use(bodyParser.raw({ type: 'application/soap+xml' }));
|
||||
app.use(bodyParser.json({ limit: '20mb' }));
|
||||
// app.use(express.urlencoded({ extended: false }));
|
||||
// @ts-ignore
|
||||
app.use(express.json());
|
||||
|
||||
app.use('/api', apiRouter)
|
||||
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Arkids backend app start on port ${port}`);
|
||||
});
|
||||
|
||||
26
package.json
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
"name": "arkids-main-app-backend",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/body-parser": "^1.19.2",
|
||||
"@types/node": "^18.16.3",
|
||||
"body-parser": "^1.20.2",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.18.2",
|
||||
"nodemon": "^2.0.22",
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^5.0.4",
|
||||
"uuid": "^9.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/cors": "^2.8.13",
|
||||
"@types/express": "types/express",
|
||||
"@types/uuid": "^9.0.1"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "nodemon index.ts",
|
||||
"start": "ts-node --esm index.ts"
|
||||
}
|
||||
}
|
||||
29
src/api/index.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import express, { Router } from 'express';
|
||||
import { ApiRoute } from '../constants';
|
||||
|
||||
import hallsRouter from './routes/halls';
|
||||
import questRouter from './routes/quests';
|
||||
import rateRouter from './routes/rate';
|
||||
import statisticsRouter from './routes/statistic';
|
||||
import storiesRouter from './routes/stories';
|
||||
import textRouter from './routes/text';
|
||||
import infoRouter from './routes/info';
|
||||
import breadcrumbsRouter from './routes/breadcrumbs';
|
||||
import servicesRouter from './routes/services';
|
||||
import faqRouter from './routes/faq';
|
||||
|
||||
const apiRouter = express.Router()
|
||||
|
||||
apiRouter.use(ApiRoute.BREADCRUMBS, breadcrumbsRouter)
|
||||
apiRouter.use(ApiRoute.FAQ, faqRouter)
|
||||
apiRouter.use(ApiRoute.INFO, infoRouter)
|
||||
apiRouter.use(ApiRoute.SERVICES, servicesRouter)
|
||||
apiRouter.use(ApiRoute.TEXT, textRouter)
|
||||
apiRouter.use(ApiRoute.HALLS, hallsRouter)
|
||||
apiRouter.use(ApiRoute.RATE, rateRouter)
|
||||
apiRouter.use(ApiRoute.STORIES, storiesRouter)
|
||||
apiRouter.use(ApiRoute.STATISTIC_INFO, statisticsRouter)
|
||||
apiRouter.use(ApiRoute.QUESTS, questRouter)
|
||||
|
||||
|
||||
export default apiRouter;
|
||||
57
src/api/routes/breadcrumbs/controller.ts
Normal file
@ -0,0 +1,57 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { PAGE_LINK, PAGE_LINK_LABEL } from '../../../constants';
|
||||
|
||||
export type BreadcrumbsType = {
|
||||
href?: string;
|
||||
label: string;
|
||||
};
|
||||
|
||||
const birthdayPageBreadcrumbs: BreadcrumbsType[] = [
|
||||
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||
{ href: PAGE_LINK.BIRTHDAY, label: PAGE_LINK_LABEL[PAGE_LINK.BIRTHDAY] },
|
||||
];
|
||||
|
||||
const graduationPageBreadcrumbs: BreadcrumbsType[] = [
|
||||
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||
{ href: PAGE_LINK.GRADUATION, label: PAGE_LINK_LABEL[PAGE_LINK.GRADUATION] },
|
||||
];
|
||||
|
||||
const outdoorsPageBreadcrumbs: BreadcrumbsType[] = [
|
||||
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||
{ href: PAGE_LINK.HOLIDAYS, label: PAGE_LINK_LABEL[PAGE_LINK.HOLIDAYS] },
|
||||
{ href: PAGE_LINK.OUTDOORS, label: PAGE_LINK_LABEL[PAGE_LINK.OUTDOORS] },
|
||||
];
|
||||
|
||||
const questsPageBreadcrumbs: BreadcrumbsType[] = [
|
||||
{ href: PAGE_LINK.HOME, label: PAGE_LINK_LABEL[PAGE_LINK.HOME] },
|
||||
{ href: PAGE_LINK.QUESTS, label: PAGE_LINK_LABEL[PAGE_LINK.QUESTS] },
|
||||
];
|
||||
|
||||
|
||||
export const getBreadcrumbs = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const {page} = req.body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayPageBreadcrumbs);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationPageBreadcrumbs);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsPageBreadcrumbs);
|
||||
}
|
||||
|
||||
case PAGE_LINK.QUESTS: {
|
||||
return res.status(200).json(questsPageBreadcrumbs);
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
10
src/api/routes/breadcrumbs/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getBreadcrumbs } from './controller';
|
||||
|
||||
const router = express.Router()
|
||||
|
||||
router.post('/', (req: Request, res: Response) => {
|
||||
return getBreadcrumbs(req, res);
|
||||
})
|
||||
|
||||
export default router;
|
||||
93
src/api/routes/faq/controller.ts
Normal file
@ -0,0 +1,93 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { PAGE_LINK } from '../../../constants';
|
||||
|
||||
export type QuestionType = {
|
||||
answer: string;
|
||||
question: string;
|
||||
};
|
||||
|
||||
const birthdayQuestions: QuestionType[] = [
|
||||
{
|
||||
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||
},
|
||||
{
|
||||
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
|
||||
+ 'Мероприятие оплачивается на месте перед его началом.',
|
||||
question: 'Как производится оплата мероприятия?',
|
||||
},
|
||||
{
|
||||
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||
},
|
||||
];
|
||||
|
||||
const graduationQuestions: QuestionType[] = [
|
||||
{
|
||||
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||
},
|
||||
{
|
||||
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона.'
|
||||
+ ' Мероприятие оплачивается на месте перед его началом.',
|
||||
question: 'Как производится оплата мероприятия?',
|
||||
},
|
||||
{
|
||||
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||
},
|
||||
];
|
||||
|
||||
const outdoorsQuestions: QuestionType[] = [
|
||||
{
|
||||
answer: 'Ответ на вопрос как забронировать зал для проведения Дня рождения?',
|
||||
question: 'Как забронировать зал для проведения Дня рождения?',
|
||||
},
|
||||
{
|
||||
answer: 'Мы не требуем предоплату. Для бронирования мероприятия достаточно Вашего номера телефона. '
|
||||
+ 'Мероприятие оплачивается на месте перед его началом.',
|
||||
question: 'Как производится оплата мероприятия?',
|
||||
},
|
||||
{
|
||||
answer: 'Ответ на вопрос какое максимальное количество детей допустимо на празднике?',
|
||||
question: 'Какое максимальное количество детей допустимо на празднике?',
|
||||
},
|
||||
];
|
||||
|
||||
export const getFaq = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const { id, page } = req.body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayQuestions);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationQuestions);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsQuestions);
|
||||
}
|
||||
|
||||
case PAGE_LINK.QUESTS: {
|
||||
switch (id) {
|
||||
case 'eger':
|
||||
return res.status(200).json(outdoorsQuestions);
|
||||
|
||||
case 'mult':
|
||||
return res.status(200).json(outdoorsQuestions);
|
||||
|
||||
case 'faraon':
|
||||
return res.status(200).json(outdoorsQuestions);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
9
src/api/routes/faq/index.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getFaq } from './controller';
|
||||
const router = express.Router()
|
||||
|
||||
router.post('/', (req: Request, res: Response) => {
|
||||
return getFaq(req, res)
|
||||
})
|
||||
|
||||
export default router;
|
||||
28
src/api/routes/halls/controller.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as path from 'path';
|
||||
|
||||
|
||||
const imageRootDir = 'static/images/information/halls/';
|
||||
|
||||
const Hall1Image = path.join(imageRootDir, 'hall1.jpg')
|
||||
const Hall2Image = path.join(imageRootDir, 'hall2.jpg')
|
||||
const Hall3Image = path.join(imageRootDir, 'hall3.jpg')
|
||||
|
||||
export type HallType = {
|
||||
area: number;
|
||||
img: {
|
||||
alt: string;
|
||||
src: string;
|
||||
};
|
||||
name: string;
|
||||
};
|
||||
|
||||
const halls: HallType[] = [
|
||||
{ area: 25, img: { alt: 'Средний Зал', src: Hall1Image }, name: 'Средний Зал' },
|
||||
{ area: 50, img: { alt: 'Большой Зал', src: Hall2Image }, name: 'Большой Зал' },
|
||||
{ area: 60, img: { alt: 'Зал Лофт', src: Hall3Image }, name: 'Зал Лофт' },
|
||||
];
|
||||
|
||||
export const getHalls = (req: Request, res: Response) => {
|
||||
return res.status(200).json(halls);
|
||||
}
|
||||
9
src/api/routes/halls/index.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getHalls } from './controller';
|
||||
const hallsRouter = express.Router()
|
||||
|
||||
hallsRouter.get('/', (req: Request, res: Response) => {
|
||||
return getHalls(req, res)
|
||||
})
|
||||
|
||||
export default hallsRouter;
|
||||
25
src/api/routes/info/controller.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { PAGE_LINK } from '../../../constants';
|
||||
|
||||
const videoLink = 'https://www.youtube.com/watch?v=VqWkQCRsKD0';
|
||||
|
||||
type HomeInfo = {
|
||||
video: string;
|
||||
};
|
||||
type ReturnInfoType = HomeInfo;
|
||||
|
||||
export const getInfo = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const body = req.body;
|
||||
|
||||
const { page } = body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.HOME:
|
||||
return res.status(200).json({ video: videoLink });
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
|
||||
}
|
||||
10
src/api/routes/info/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getInfo } from './controller';
|
||||
|
||||
const router = express.Router()
|
||||
|
||||
router.post('/', (req: Request, res: Response) => {
|
||||
return getInfo(req, res);
|
||||
})
|
||||
|
||||
export default router;
|
||||
432
src/api/routes/quests/controller.ts
Normal file
@ -0,0 +1,432 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as path from 'path';
|
||||
import { COLORS, ColorVariant } from '../../../constants';
|
||||
import { StoryType } from '../stories/controller';
|
||||
import {v4 as uuid} from 'uuid';
|
||||
|
||||
const imageRootDir = 'static/images/quests/';
|
||||
|
||||
const egerFeedbackImage = path.join(imageRootDir, 'stories/eger/desktop/feedback.png');
|
||||
const egerGalleryImage = path.join(imageRootDir, 'stories/eger/desktop/gallery.png');
|
||||
const egerPlotImage = path.join(imageRootDir, 'stories/eger/desktop/plot.png');
|
||||
const egerFeedbackMobileImage = path.join(imageRootDir, 'stories/eger/mobile/feedback.png');
|
||||
const egerGalleryMobileImage = path.join(imageRootDir, 'stories/eger/mobile/gallery.png');
|
||||
const egerPlotMobileImage = path.join(imageRootDir, 'stories/eger/mobile/plot.png');
|
||||
|
||||
const egerBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/eger/desktop/background.png')
|
||||
const egerBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/eger/mobile/background.png')
|
||||
|
||||
const egerCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/eger-card.png')
|
||||
const egerCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/eger-card.png')
|
||||
|
||||
const faraonFeedbackImage = path.join(imageRootDir, 'stories/faraon/desktop/feedback.png');
|
||||
const faraonGalleryImage = path.join(imageRootDir, 'stories/faraon/desktop/gallery.png');
|
||||
const faraonPlotImage = path.join(imageRootDir, 'stories/faraon/desktop/plot.png');
|
||||
const faraonFeedbackMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/feedback.png');
|
||||
const faraonGalleryMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/gallery.png');
|
||||
const faraonPlotMobileImage = path.join(imageRootDir, 'stories/faraon/mobile/plot.png');
|
||||
|
||||
const faraonBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/faraon/desktop/background.png')
|
||||
const faraonBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/faraon/mobile/background.png')
|
||||
|
||||
const faraonCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/faraon-card.png')
|
||||
const faraonCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/faraon-card.png')
|
||||
|
||||
const multFeedbackImage = path.join(imageRootDir, '/stories/mult/desktop/feedback.png');
|
||||
const multGalleryImage = path.join(imageRootDir, '/stories/mult/desktop/gallery.png');
|
||||
const multPlotImage = path.join(imageRootDir, '/stories/mult/desktop/plot.png');
|
||||
const multFeedbackMobileImage = path.join(imageRootDir, '/stories/mult/mobile/feedback.png');
|
||||
const multGalleryMobileImage = path.join(imageRootDir, '/stories/mult/mobile/gallery.png');
|
||||
const multPlotMobileImage = path.join(imageRootDir, '/stories/mult/mobile/plot.png');
|
||||
|
||||
const multBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/mult/desktop/background.png')
|
||||
const multBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/mult/mobile/background.png')
|
||||
|
||||
const multCardBackgroundDesktopImage = path.join(imageRootDir, '/backgrounds/main/desktop/mult-card.png')
|
||||
const multCardBackgroundMobileImage = path.join(imageRootDir, '/backgrounds/main/mobile/mult-card.png')
|
||||
|
||||
export type QuestItemType = {
|
||||
age: {
|
||||
styles?: object;
|
||||
text: string;
|
||||
};
|
||||
backgrounds?: {
|
||||
mobileSrc: string;
|
||||
src: string;
|
||||
};
|
||||
cardBgImg: {
|
||||
mobileSrc: string;
|
||||
src: string;
|
||||
};
|
||||
description: string;
|
||||
id: string;
|
||||
labels: {
|
||||
items: {
|
||||
mark?: true;
|
||||
markMobile?: true;
|
||||
text: string;
|
||||
}[];
|
||||
styles?: object;
|
||||
};
|
||||
partySize: {
|
||||
max: number;
|
||||
min: number;
|
||||
styles?: object;
|
||||
};
|
||||
price: number;
|
||||
rating: number;
|
||||
statisticsBackground: string;
|
||||
stories?: StoryType[];
|
||||
time: {
|
||||
styles?: object;
|
||||
text: string;
|
||||
};
|
||||
title: {
|
||||
styles?: object;
|
||||
text: string;
|
||||
};
|
||||
type: {
|
||||
styles?: object;
|
||||
text: string;
|
||||
};
|
||||
};
|
||||
|
||||
const egerStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Сюжет',
|
||||
src: egerPlotImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Сюжет',
|
||||
src: egerPlotMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'questPlot',
|
||||
},
|
||||
title: 'Сюжет',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: egerFeedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: egerFeedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: egerGalleryImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: egerGalleryMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\\n и видео',
|
||||
},
|
||||
];
|
||||
export const egerQuest: QuestItemType = {
|
||||
age: {
|
||||
text: '10+',
|
||||
},
|
||||
backgrounds: {
|
||||
mobileSrc: egerBackgroundMobileImage,
|
||||
src: egerBackgroundDesktopImage,
|
||||
},
|
||||
cardBgImg: {
|
||||
mobileSrc: egerCardBackgroundMobileImage,
|
||||
src: egerCardBackgroundDesktopImage,
|
||||
},
|
||||
description: 'Команда попадает в дом лесника с множеством спецэффектов и скрытых ходов. '
|
||||
+ 'Есть возможность выбрать уровень сложности: от детского до самого страшного',
|
||||
id: 'eger',
|
||||
labels: {
|
||||
items: [
|
||||
{ text: 'страшный' },
|
||||
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||
{ mark: true, text: 'дымовые и световые спецэффекты' },
|
||||
{ text: 'уровни с актёрами' },
|
||||
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||
{ mark: true, text: 'квест на день рождения' },
|
||||
{ mark: true, markMobile: true, text: 'подвижный' },
|
||||
],
|
||||
},
|
||||
partySize: {
|
||||
max: 12,
|
||||
min: 2,
|
||||
},
|
||||
price: 3500,
|
||||
rating: 230,
|
||||
statisticsBackground: COLORS[ColorVariant.GRADIENT_PERI4],
|
||||
stories: egerStories,
|
||||
time: {
|
||||
text: '60 минут',
|
||||
},
|
||||
title: {
|
||||
styles: {
|
||||
color: '#fff',
|
||||
fontFamily: 'DwarvenStonecraftCyr',
|
||||
fontSize: 45,
|
||||
},
|
||||
text: 'Егерь',
|
||||
},
|
||||
type: {
|
||||
text: 'квест\\n с актёрами',
|
||||
},
|
||||
};
|
||||
|
||||
const faraonStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Сюжет',
|
||||
src: faraonPlotImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Сюжет',
|
||||
src: faraonPlotMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'questPlot',
|
||||
},
|
||||
title: 'Сюжет',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: faraonFeedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: faraonFeedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: faraonGalleryImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: faraonGalleryMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\\n и видео',
|
||||
},
|
||||
];
|
||||
|
||||
export const faraonQuest: QuestItemType = {
|
||||
age: {
|
||||
styles: {
|
||||
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||
color: COLORS[ColorVariant.VERI_PERI],
|
||||
},
|
||||
text: '5+',
|
||||
},
|
||||
backgrounds: {
|
||||
mobileSrc: faraonBackgroundMobileImage,
|
||||
src: faraonBackgroundDesktopImage,
|
||||
},
|
||||
cardBgImg: {
|
||||
mobileSrc: faraonCardBackgroundMobileImage,
|
||||
src: faraonCardBackgroundDesktopImage,
|
||||
},
|
||||
description: 'Команда попадает в пирамиду: тоннели, лабиринты, спуски и подъёмы, продуманная '
|
||||
+ 'электроника и задания как в настоящем фильме про Египет',
|
||||
id: 'faraon',
|
||||
labels: {
|
||||
items: [
|
||||
{ text: 'древний египет' },
|
||||
{ mark: true, markMobile: true, text: 'уровни с актёрами' },
|
||||
{ mark: true, text: 'логический квест' },
|
||||
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||
{ text: 'подвижный' },
|
||||
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||
{ mark: true, text: 'квест на день рождения' },
|
||||
],
|
||||
styles: {
|
||||
color: COLORS[ColorVariant.VERI_PERI],
|
||||
},
|
||||
},
|
||||
partySize: {
|
||||
max: 15,
|
||||
min: 6,
|
||||
styles: {
|
||||
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||
color: COLORS[ColorVariant.VERI_PERI],
|
||||
},
|
||||
},
|
||||
price: 4500,
|
||||
rating: 230,
|
||||
statisticsBackground: COLORS[ColorVariant.GRADIENT_ORANGE],
|
||||
stories: faraonStories,
|
||||
time: {
|
||||
styles: {
|
||||
borderColor: COLORS[ColorVariant.VERI_PERI],
|
||||
color: COLORS[ColorVariant.VERI_PERI],
|
||||
},
|
||||
text: '60 минут',
|
||||
},
|
||||
title: {
|
||||
styles: {
|
||||
border: '3px #fff',
|
||||
color: 'linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)',
|
||||
fontFamily: 'Angry',
|
||||
fontSize: 45,
|
||||
},
|
||||
text: 'Фараон',
|
||||
},
|
||||
type: {
|
||||
styles: {
|
||||
color: COLORS[ColorVariant.VERI_PERI],
|
||||
},
|
||||
text: 'экшн-квест',
|
||||
},
|
||||
};
|
||||
|
||||
const stories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Сюжет',
|
||||
src: multPlotImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Сюжет',
|
||||
src: multPlotMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'questPlot',
|
||||
},
|
||||
title: 'Сюжет',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: multFeedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: multFeedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: multGalleryImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: multGalleryMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\\n и видео',
|
||||
},
|
||||
];
|
||||
|
||||
export const multQuest: QuestItemType = {
|
||||
age: {
|
||||
text: '5+',
|
||||
},
|
||||
backgrounds: {
|
||||
mobileSrc: multBackgroundMobileImage,
|
||||
src: multBackgroundDesktopImage,
|
||||
},
|
||||
cardBgImg: {
|
||||
mobileSrc: multCardBackgroundMobileImage,
|
||||
src: multCardBackgroundDesktopImage,
|
||||
},
|
||||
description: 'Команда попадает в мультвселенную, где собраны самые популярные сюжеты мультфильмов и детские герои: '
|
||||
+ 'Гравити Фолз, Алиса, Миньоны и Холодное сердце',
|
||||
id: 'mult',
|
||||
labels: {
|
||||
items: [
|
||||
{ text: 'детский квест' },
|
||||
{ mark: true, markMobile: true, text: 'с сопровождающим' },
|
||||
{ mark: true, text: 'логический квест' },
|
||||
{ mark: true, markMobile: true, text: 'подойдёт детям' },
|
||||
{ text: 'подвижный' },
|
||||
{ mark: true, markMobile: true, text: 'для большой компании' },
|
||||
{ mark: true, text: 'квест на день рождения' },
|
||||
],
|
||||
},
|
||||
partySize: {
|
||||
max: 60,
|
||||
min: 3,
|
||||
},
|
||||
price: 7500,
|
||||
rating: 230,
|
||||
statisticsBackground: COLORS[ColorVariant.GRADIENT_GREEN],
|
||||
stories,
|
||||
time: {
|
||||
text: '60 минут',
|
||||
},
|
||||
title: {
|
||||
styles: {
|
||||
border: '4px #fff',
|
||||
color: 'linear-gradient(134.56deg, #FFF500 11.78%, #FF3399 84.81%)',
|
||||
fontFamily: 'Airfool',
|
||||
fontSize: 54,
|
||||
},
|
||||
text: 'Мульт',
|
||||
},
|
||||
type: {
|
||||
text: 'детский квест',
|
||||
},
|
||||
};
|
||||
|
||||
export const getOne = (req: Request, res: Response) => {
|
||||
const {id} = req.params;
|
||||
|
||||
switch (id) {
|
||||
case 'eger':
|
||||
return res.status(200).json(egerQuest);
|
||||
|
||||
case 'faraon':
|
||||
return res.status(200).json(faraonQuest);
|
||||
|
||||
case 'mult':
|
||||
return res.status(200).json(multQuest);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export const getAll = (req: Request, res: Response) => {
|
||||
return res.status(200).json([
|
||||
egerQuest,
|
||||
faraonQuest,
|
||||
multQuest,
|
||||
])
|
||||
}
|
||||
14
src/api/routes/quests/index.ts
Normal file
@ -0,0 +1,14 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getAll, getOne } from './controller';
|
||||
|
||||
const questRouter = express.Router()
|
||||
|
||||
questRouter.get('/', (req: Request, res: Response) => {
|
||||
return getAll(req, res);
|
||||
})
|
||||
|
||||
questRouter.get('/:id', (req: Request, res: Response) => {
|
||||
return getOne(req, res);
|
||||
})
|
||||
|
||||
export default questRouter;
|
||||
532
src/api/routes/rate/controller.ts
Normal file
@ -0,0 +1,532 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as path from 'path';
|
||||
import { PAGE_LINK, SERVICE } from '../../../constants';
|
||||
|
||||
const imageRootDir = 'static/images/rate/';
|
||||
|
||||
const BaseImg = path.join(imageRootDir, 'base.png');
|
||||
const PremiumImg = path.join(imageRootDir, 'premium.png');
|
||||
const StandartImg = path.join(imageRootDir, 'standart.png');
|
||||
const VipImg = path.join(imageRootDir, 'vip.png');
|
||||
|
||||
export type SingleItemServiceType = {
|
||||
enable: boolean;
|
||||
price?: number;
|
||||
startPrice?: number;
|
||||
value?: string;
|
||||
};
|
||||
export type ItemServiceType = {
|
||||
[name: string]: SingleItemServiceType;
|
||||
};
|
||||
export type RateItemType = {
|
||||
id: string;
|
||||
img: {
|
||||
alt: string;
|
||||
height?: number;
|
||||
src: string;
|
||||
width?: number;
|
||||
};
|
||||
maxPeople: number;
|
||||
overpayment: number;
|
||||
price?: number;
|
||||
pricePerPerson?: number;
|
||||
services: ItemServiceType;
|
||||
title: string;
|
||||
};
|
||||
|
||||
const birthdayPageRate: RateItemType[] = [
|
||||
{
|
||||
id: 'base',
|
||||
img: {
|
||||
alt: 'Базовый',
|
||||
src: BaseImg,
|
||||
},
|
||||
maxPeople: 6,
|
||||
overpayment: 500,
|
||||
price: 9900,
|
||||
services: {
|
||||
[SERVICE.ANIMATOR]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '1,5 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOS]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: false,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Базовый',
|
||||
},
|
||||
{
|
||||
id: 'standart',
|
||||
img: {
|
||||
alt: 'Стандарт',
|
||||
src: StandartImg,
|
||||
},
|
||||
maxPeople: 10,
|
||||
overpayment: 500,
|
||||
price: 13900,
|
||||
services: {
|
||||
[SERVICE.ANIMATOR]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '2 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOS]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Стандарт',
|
||||
},
|
||||
{
|
||||
id: 'premium',
|
||||
img: {
|
||||
alt: 'Премиум',
|
||||
src: PremiumImg,
|
||||
},
|
||||
maxPeople: 12,
|
||||
overpayment: 500,
|
||||
price: 19900,
|
||||
services: {
|
||||
[SERVICE.ANIMATOR]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '3 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOS]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Премиум',
|
||||
},
|
||||
{
|
||||
id: 'vip',
|
||||
img: {
|
||||
alt: 'VIP',
|
||||
src: VipImg,
|
||||
},
|
||||
maxPeople: 20,
|
||||
overpayment: 500,
|
||||
price: 29900,
|
||||
services: {
|
||||
[SERVICE.ANIMATOR]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '4 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: true,
|
||||
startPrice: 1000,
|
||||
},
|
||||
[SERVICE.PHOTOS]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
value: '2 квеста',
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Вип',
|
||||
},
|
||||
];
|
||||
const graduationPageRate: RateItemType[] = [
|
||||
{
|
||||
id: 'base',
|
||||
img: {
|
||||
alt: 'Базовый',
|
||||
src: BaseImg,
|
||||
},
|
||||
maxPeople: 6,
|
||||
overpayment: 500,
|
||||
pricePerPerson: 1390,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: false,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DIPLOMA]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '1,5 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: false,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: false,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Базовый',
|
||||
},
|
||||
{
|
||||
id: 'standart',
|
||||
img: {
|
||||
alt: 'Стандарт',
|
||||
src: StandartImg,
|
||||
},
|
||||
maxPeople: 10,
|
||||
overpayment: 500,
|
||||
pricePerPerson: 1990,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: false,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DIPLOMA]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '2 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Стандарт',
|
||||
},
|
||||
{
|
||||
id: 'premium',
|
||||
img: {
|
||||
alt: 'Премиум',
|
||||
src: PremiumImg,
|
||||
},
|
||||
maxPeople: 12,
|
||||
overpayment: 500,
|
||||
pricePerPerson: 2990,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DIPLOMA]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enable: true,
|
||||
value: '3 часа',
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enable: true,
|
||||
price: 1000,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Премиум',
|
||||
},
|
||||
];
|
||||
const outdoorsPageRate: RateItemType[] = [
|
||||
{
|
||||
id: 'base',
|
||||
img: {
|
||||
alt: 'Базовый',
|
||||
src: BaseImg,
|
||||
},
|
||||
maxPeople: 6,
|
||||
overpayment: 500,
|
||||
price: 9900,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DURATION]: {
|
||||
enable: true,
|
||||
value: '2 часа',
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: false,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TEAM_BUILDING]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Базовый',
|
||||
},
|
||||
{
|
||||
id: 'standart',
|
||||
img: {
|
||||
alt: 'Стандарт',
|
||||
src: StandartImg,
|
||||
},
|
||||
maxPeople: 10,
|
||||
overpayment: 500,
|
||||
price: 13900,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DURATION]: {
|
||||
enable: true,
|
||||
value: '3 часа',
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: false,
|
||||
startPrice: 4900,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TEAM_BUILDING]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Стандарт',
|
||||
},
|
||||
{
|
||||
id: 'premium',
|
||||
img: {
|
||||
alt: 'Премиум',
|
||||
src: PremiumImg,
|
||||
},
|
||||
maxPeople: 12,
|
||||
overpayment: 500,
|
||||
price: 19900,
|
||||
services: {
|
||||
[SERVICE.ANIMATION]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.DURATION]: {
|
||||
enable: true,
|
||||
value: '4 часа',
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.QUEST]: {
|
||||
enable: true,
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enable: true,
|
||||
price: 4000,
|
||||
},
|
||||
[SERVICE.TEAM_BUILDING]: {
|
||||
enable: true,
|
||||
},
|
||||
},
|
||||
title: 'Премиум',
|
||||
},
|
||||
];
|
||||
|
||||
export const getRate = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const {page} = req.body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayPageRate);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationPageRate);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsPageRate);
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
10
src/api/routes/rate/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getRate } from './controller';
|
||||
|
||||
const rateRouter = express.Router()
|
||||
|
||||
rateRouter.post('/', (req: Request, res: Response) => {
|
||||
return getRate(req, res);
|
||||
})
|
||||
|
||||
export default rateRouter;
|
||||
64
src/api/routes/services/controller.ts
Normal file
@ -0,0 +1,64 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { PAGE_LINK, SERVICE, servicesList, ServiceType } from '../../../constants';
|
||||
|
||||
|
||||
const birthdayPageServices: ServiceType[] = [
|
||||
servicesList[SERVICE.QUEST],
|
||||
servicesList[SERVICE.HALL],
|
||||
servicesList[SERVICE.ANIMATOR],
|
||||
servicesList[SERVICE.DECORATION],
|
||||
servicesList[SERVICE.TABLEWARE_FESTIVE],
|
||||
servicesList[SERVICE.PHOTOS],
|
||||
servicesList[SERVICE.SHOW_DISCO],
|
||||
servicesList[SERVICE.SCREENWRITER],
|
||||
servicesList[SERVICE.MASTERCLASS],
|
||||
servicesList[SERVICE.CRYO_SHOW],
|
||||
];
|
||||
|
||||
const graduationPageServices: ServiceType[] = [
|
||||
servicesList[SERVICE.QUEST],
|
||||
servicesList[SERVICE.HALL],
|
||||
servicesList[SERVICE.ANIMATION],
|
||||
servicesList[SERVICE.PHOTOGRAPHER],
|
||||
servicesList[SERVICE.DECORATION],
|
||||
servicesList[SERVICE.TABLEWARE_FESTIVE],
|
||||
servicesList[SERVICE.DIPLOMA],
|
||||
servicesList[SERVICE.SHOW_DISCO],
|
||||
servicesList[SERVICE.SCREENWRITER],
|
||||
servicesList[SERVICE.MASTERCLASS],
|
||||
servicesList[SERVICE.FACE_PAINTING],
|
||||
servicesList[SERVICE.CRYO_SHOW],
|
||||
];
|
||||
|
||||
const outdoorsPageServices: ServiceType[] = [
|
||||
servicesList[SERVICE.QUEST],
|
||||
servicesList[SERVICE.DURATION],
|
||||
servicesList[SERVICE.ANIMATION],
|
||||
servicesList[SERVICE.PHOTOGRAPHER],
|
||||
servicesList[SERVICE.TEAM_BUILDING],
|
||||
servicesList[SERVICE.SHOW_DISCO],
|
||||
servicesList[SERVICE.FACE_PAINTING],
|
||||
];
|
||||
|
||||
export const getServices = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const {page} = req.body;
|
||||
// @ts-ignore
|
||||
console.log('Body', req.body);
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayPageServices);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationPageServices);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsPageServices);
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
11
src/api/routes/services/index.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import {
|
||||
getServices } from './controller';
|
||||
|
||||
const router = express.Router()
|
||||
|
||||
router.post('/', (req: Request, res: Response) => {
|
||||
return getServices(req, res);
|
||||
})
|
||||
|
||||
export default router;
|
||||
939
src/api/routes/statistic/controller.ts
Normal file
@ -0,0 +1,939 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as path from 'path';
|
||||
import { PAGE_LINK } from '../../../constants';
|
||||
|
||||
const imageRootDir = 'static/images/information/statistics';
|
||||
|
||||
const DecorationDesktopImg = path.join(imageRootDir, 'desktop/decoration.png');
|
||||
const DiplomaDesktopImg = path.join(imageRootDir, 'desktop/graduation/diploma.png');
|
||||
const KidsDesktopImg = path.join(imageRootDir, 'desktop/kids.png');
|
||||
const LikeDesktopImg = path.join(imageRootDir, 'desktop/like.png');
|
||||
const StatDecorDesktopImg = path.join(imageRootDir, 'desktop/outdoors/decoration.png');
|
||||
const StatScooterDesktopImg = path.join(imageRootDir, 'desktop/outdoors/scooter.png');
|
||||
const PinataDesktopImg = path.join(imageRootDir, 'desktop/pinata.png');
|
||||
const ProgramsDesktopImg = path.join(imageRootDir, 'desktop/programms.png');
|
||||
const BooksDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/books.png');
|
||||
const KeysDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/keys.png');
|
||||
const MapDesktopImg = path.join(imageRootDir, 'desktop/quests/eger/map.png');
|
||||
const RateDesktopImg = path.join(imageRootDir, 'desktop/rate.png');
|
||||
const StarDesktopImg = path.join(imageRootDir, 'desktop/star.png');
|
||||
|
||||
const CupMobileImg = path.join(imageRootDir, 'mobile/cup.png');
|
||||
const DecorationMobileImg = path.join(imageRootDir, 'mobile/decoration.png');
|
||||
const DiplomaMobileImg = path.join(imageRootDir, 'mobile/graduation/diploma.png');
|
||||
const KidsMobileImg = path.join(imageRootDir, 'mobile/kids.png');
|
||||
const Kids2MobileImg = path.join(imageRootDir, 'mobile/kids2.png');
|
||||
const LikeMobileImg = path.join(imageRootDir, 'mobile/like.png');
|
||||
const StatDecorMobileImg = path.join(imageRootDir, 'mobile/outdoors/decoration.png');
|
||||
const StatScooterMobileImg = path.join(imageRootDir, 'mobile/outdoors/scooter.png');
|
||||
const PinataMobileImg = path.join(imageRootDir, 'mobile/pinata.png');
|
||||
const ProgramsMobileImg = path.join(imageRootDir, 'mobile/programms.png');
|
||||
const BooksMobileImg = path.join(imageRootDir, 'mobile/quests/eger/books.png');
|
||||
const KeysMobileImg = path.join(imageRootDir, 'mobile/quests/eger/keys.png');
|
||||
const MapMobileImg = path.join(imageRootDir, 'mobile/quests/eger/map.png');
|
||||
const RateMobileImg = path.join(imageRootDir, 'mobile/rate.png');
|
||||
const StarMobileImg = path.join(imageRootDir, 'mobile/star.png');
|
||||
|
||||
export type StatisticsItem = {
|
||||
img?: {
|
||||
alt: string;
|
||||
mobilePosition?: {
|
||||
bottom?: number;
|
||||
left?: number;
|
||||
right?: number;
|
||||
top?: number;
|
||||
};
|
||||
mobileSrc?: string;
|
||||
position?: {
|
||||
bottom?: number;
|
||||
left?: number;
|
||||
right?: number;
|
||||
top?: number;
|
||||
};
|
||||
src: string;
|
||||
height: number;
|
||||
mobileHeight?: number;
|
||||
mobileWidth?: number;
|
||||
width: number;
|
||||
};
|
||||
mobileOrder?: number;
|
||||
mobileText?: string;
|
||||
order?: number;
|
||||
size: {
|
||||
sm: number | 'auto';
|
||||
width: number | 'auto';
|
||||
xs: number;
|
||||
};
|
||||
text: string;
|
||||
title: string;
|
||||
};
|
||||
|
||||
const birthdayItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'combo',
|
||||
mobilePosition: {
|
||||
right: 12,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: RateMobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 60,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: RateDesktopImg,
|
||||
width: 80,
|
||||
height: 90
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 130,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'комбо для\\n лучшего праздника',
|
||||
title: 'Выгодные',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'programs',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: -20,
|
||||
},
|
||||
mobileSrc: ProgramsMobileImg,
|
||||
mobileHeight: 84,
|
||||
mobileWidth: 110,
|
||||
position: {
|
||||
right: 0,
|
||||
top: 15,
|
||||
},
|
||||
src: ProgramsDesktopImg,
|
||||
width: 72,
|
||||
height: 96
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 210,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'индивидуальные программы',
|
||||
title: 'Тематические',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: DecorationMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 90,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 15,
|
||||
},
|
||||
src: DecorationDesktopImg,
|
||||
width: 106,
|
||||
height: 80
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'украшенные\\n и просторные',
|
||||
title: 'Залы',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 26,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: KidsMobileImg,
|
||||
mobileHeight: 108,
|
||||
mobileWidth: 74,
|
||||
position: {
|
||||
right: -10,
|
||||
top: 16,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
mobileText: 'для детей разных возрастов',
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'для детей\\n разных возрастов',
|
||||
title: 'Развлечения',
|
||||
},
|
||||
];
|
||||
|
||||
const homeItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'pinata',
|
||||
mobilePosition: {
|
||||
left: 37,
|
||||
top: -40,
|
||||
},
|
||||
mobileSrc: PinataMobileImg,
|
||||
mobileHeight: 131,
|
||||
mobileWidth: 128,
|
||||
src: PinataDesktopImg,
|
||||
width: 123,
|
||||
height: 120
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 150,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'праздников\\n проведено',
|
||||
title: '5700 +',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'star',
|
||||
mobilePosition: {
|
||||
right: 6,
|
||||
top: -20,
|
||||
},
|
||||
mobileSrc: StarMobileImg,
|
||||
mobileHeight: 112,
|
||||
mobileWidth: 112,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 15,
|
||||
},
|
||||
src: StarDesktopImg,
|
||||
width: 66,
|
||||
height: 66
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 190,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'отзывы клиентов\\n на Яндекс',
|
||||
title: '5 звёзд',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'like',
|
||||
mobilePosition: {
|
||||
right: 17,
|
||||
top: -14,
|
||||
},
|
||||
mobileSrc: LikeMobileImg,
|
||||
mobileHeight: 89,
|
||||
mobileWidth: 87,
|
||||
position: {
|
||||
right: 5,
|
||||
top: 15,
|
||||
},
|
||||
src: LikeDesktopImg,
|
||||
width: 76,
|
||||
height: 72
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 150,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'цены и гибкий\\n подход к клиенту',
|
||||
title: 'Выгодные',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'cup',
|
||||
mobilePosition: {
|
||||
right: 3,
|
||||
top: -29,
|
||||
},
|
||||
src: CupMobileImg,
|
||||
height: 101,
|
||||
width: 101,
|
||||
mobileHeight: 131,
|
||||
mobileWidth: 131
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 190,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'успешной работы\\n в сфере развлечений',
|
||||
title: '6 лет',
|
||||
},
|
||||
];
|
||||
|
||||
const graduationItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'combo',
|
||||
mobilePosition: {
|
||||
left: 12,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: RateMobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 60,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 5,
|
||||
},
|
||||
src: RateDesktopImg,
|
||||
width: 80,
|
||||
height: 90
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 130,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'комбо для лучшего праздника',
|
||||
title: 'Выгодные',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'diploma',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: DiplomaMobileImg,
|
||||
mobileHeight: 90,
|
||||
mobileWidth: 100,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: DiplomaDesktopImg,
|
||||
width: 76,
|
||||
height: 85
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 210,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'индивидуальных\\n дипломов',
|
||||
title: 'Вручение',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: DecorationMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 90,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 10,
|
||||
},
|
||||
src: DecorationDesktopImg,
|
||||
width: 106,
|
||||
height: 80
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'украшенные и просторные',
|
||||
title: 'Залы',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: KidsMobileImg,
|
||||
mobileHeight: 108,
|
||||
mobileWidth: 74,
|
||||
position: {
|
||||
right: -10,
|
||||
top: 15,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'для больших\\n команд',
|
||||
title: 'Квесты',
|
||||
},
|
||||
];
|
||||
|
||||
const outdoorsItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'combo',
|
||||
mobilePosition: {
|
||||
left: 12,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: RateMobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 60,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 5,
|
||||
},
|
||||
src: RateDesktopImg,
|
||||
width: 80,
|
||||
height: 90
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 130,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'комбо для\\n лучшего праздника',
|
||||
title: 'Выгодные',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'programs',
|
||||
mobilePosition: {
|
||||
right: 10,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: StatScooterMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 114,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: StatScooterDesktopImg,
|
||||
width: 94,
|
||||
height: 98
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 210,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'по Москве\\n и Московской области',
|
||||
title: 'Выезд',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 14,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: StatDecorMobileImg,
|
||||
mobileHeight: 76,
|
||||
mobileWidth: 136,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 10,
|
||||
},
|
||||
src: StatDecorDesktopImg,
|
||||
width: 60,
|
||||
height: 108
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'реквизит\\n на заказ',
|
||||
title: 'Проф',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
left: 28,
|
||||
top: -10,
|
||||
},
|
||||
mobileSrc: KidsMobileImg,
|
||||
mobileHeight: 108,
|
||||
mobileWidth: 74,
|
||||
position: {
|
||||
right: -10,
|
||||
top: 15,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'для детей\\n разных возрастов',
|
||||
title: 'Развлечения',
|
||||
},
|
||||
];
|
||||
|
||||
const egerQuestItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 15,
|
||||
top: -20,
|
||||
},
|
||||
mobileSrc: Kids2MobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 110,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 20,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 1,
|
||||
order: 1,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 200,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'для детей\\n разных возрастов',
|
||||
title: 'Задания',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'programs',
|
||||
mobilePosition: {
|
||||
right: -20,
|
||||
top: 5,
|
||||
},
|
||||
mobileSrc: BooksMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 122,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: BooksDesktopImg,
|
||||
width: 109,
|
||||
height: 90
|
||||
},
|
||||
mobileOrder: 4,
|
||||
order: 2,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'сюжет\\n каждый год',
|
||||
title: 'Новый',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 14,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: MapMobileImg,
|
||||
mobileHeight: 68,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 10,
|
||||
},
|
||||
src: MapDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 3,
|
||||
order: 3,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'различных\\n локаций',
|
||||
title: 'Шесть',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 0,
|
||||
top: -15,
|
||||
},
|
||||
mobileSrc: KeysMobileImg,
|
||||
mobileHeight: 64,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 30,
|
||||
top: 15,
|
||||
},
|
||||
src: KeysDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 2,
|
||||
order: 4,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 140,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'система\\n бронирования',
|
||||
title: 'Быстрая',
|
||||
},
|
||||
];
|
||||
|
||||
const faraonQuestItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 15,
|
||||
top: -20,
|
||||
},
|
||||
mobileSrc: Kids2MobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 110,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 20,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 1,
|
||||
order: 1,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 200,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'для детей\\n разных возрастов',
|
||||
title: 'Задания',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'programs',
|
||||
mobilePosition: {
|
||||
right: -20,
|
||||
top: 5,
|
||||
},
|
||||
mobileSrc: BooksMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 122,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: BooksDesktopImg,
|
||||
width: 109,
|
||||
height: 90
|
||||
},
|
||||
mobileOrder: 4,
|
||||
order: 2,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'сюжет\\n каждый год',
|
||||
title: 'Новый',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 14,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: MapMobileImg,
|
||||
mobileHeight: 68,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 10,
|
||||
},
|
||||
src: MapDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 3,
|
||||
order: 3,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'различных\\n локаций',
|
||||
title: 'Шесть',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 0,
|
||||
top: -15,
|
||||
},
|
||||
mobileSrc: KeysMobileImg,
|
||||
mobileHeight: 64,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 30,
|
||||
top: 15,
|
||||
},
|
||||
src: KeysDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 2,
|
||||
order: 4,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 140,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'система\\n бронирования',
|
||||
title: 'Быстрая',
|
||||
},
|
||||
];
|
||||
|
||||
const multQuestItems: StatisticsItem[] = [
|
||||
{
|
||||
size: {
|
||||
sm: 'auto',
|
||||
width: 'auto',
|
||||
xs: 12,
|
||||
},
|
||||
text: 'Ежегодно нас выбирают и к нам возвращаются тысячи клиентов, потому что:',
|
||||
title: 'Доверьтесь лидеру\\n в сфере развлечений',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 15,
|
||||
top: -20,
|
||||
},
|
||||
mobileSrc: Kids2MobileImg,
|
||||
mobileHeight: 106,
|
||||
mobileWidth: 110,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 20,
|
||||
},
|
||||
src: KidsDesktopImg,
|
||||
width: 90,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 1,
|
||||
order: 1,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 200,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'для детей\\n разных возрастов',
|
||||
title: 'Задания',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'programs',
|
||||
mobilePosition: {
|
||||
right: -20,
|
||||
top: 5,
|
||||
},
|
||||
mobileSrc: BooksMobileImg,
|
||||
mobileHeight: 116,
|
||||
mobileWidth: 122,
|
||||
position: {
|
||||
right: 22,
|
||||
top: 15,
|
||||
},
|
||||
src: BooksDesktopImg,
|
||||
width: 109,
|
||||
height: 90
|
||||
},
|
||||
mobileOrder: 4,
|
||||
order: 2,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 180,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'сюжет\\n каждый год',
|
||||
title: 'Новый',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'decor',
|
||||
mobilePosition: {
|
||||
right: 14,
|
||||
top: 10,
|
||||
},
|
||||
mobileSrc: MapMobileImg,
|
||||
mobileHeight: 68,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 35,
|
||||
top: 10,
|
||||
},
|
||||
src: MapDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 3,
|
||||
order: 3,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 160,
|
||||
xs: 5,
|
||||
},
|
||||
text: 'различных\\n локаций',
|
||||
title: 'Шесть',
|
||||
},
|
||||
{
|
||||
img: {
|
||||
alt: 'kids',
|
||||
mobilePosition: {
|
||||
right: 0,
|
||||
top: -15,
|
||||
},
|
||||
mobileSrc: KeysMobileImg,
|
||||
mobileHeight: 64,
|
||||
mobileWidth: 94,
|
||||
position: {
|
||||
right: 30,
|
||||
top: 15,
|
||||
},
|
||||
src: KeysDesktopImg,
|
||||
width: 69,
|
||||
height: 94
|
||||
},
|
||||
mobileOrder: 2,
|
||||
order: 4,
|
||||
size: {
|
||||
sm: 2,
|
||||
width: 140,
|
||||
xs: 6,
|
||||
},
|
||||
text: 'система\\n бронирования',
|
||||
title: 'Быстрая',
|
||||
},
|
||||
];
|
||||
|
||||
export const getStatistics = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const {page, id} = req.body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayItems);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationItems);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsItems);
|
||||
}
|
||||
|
||||
case PAGE_LINK.HOME: {
|
||||
return res.status(200).json(homeItems);
|
||||
}
|
||||
|
||||
case PAGE_LINK.QUESTS: {
|
||||
switch (id) {
|
||||
case 'eger':
|
||||
return res.status(200).json(egerQuestItems);
|
||||
|
||||
case 'mult':
|
||||
return res.status(200).json(multQuestItems);
|
||||
|
||||
case 'faraon':
|
||||
return res.status(200).json(faraonQuestItems);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
10
src/api/routes/statistic/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getStatistics } from './controller';
|
||||
|
||||
const statisticsRouter = express.Router()
|
||||
|
||||
statisticsRouter.post('/', (req: Request, res: Response) => {
|
||||
return getStatistics(req, res);
|
||||
})
|
||||
|
||||
export default statisticsRouter;
|
||||
327
src/api/routes/stories/controller.ts
Normal file
@ -0,0 +1,327 @@
|
||||
import { Request, Response } from 'express';
|
||||
import * as path from 'path';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { PAGE_LINK } from '../../../constants';
|
||||
|
||||
const imageRootDir = 'static/images/stories/';
|
||||
|
||||
const faqImage = path.join(imageRootDir, 'birthday/faq.png')
|
||||
const faqMobileImage = path.join(imageRootDir, 'birthday/faq_mobile.png')
|
||||
const feedbackImage = path.join(imageRootDir, 'birthday/feedback.png')
|
||||
const feedbackMobileImage = path.join(imageRootDir, 'birthday/feedback_mobile.png')
|
||||
const photoImage = path.join(imageRootDir, 'birthday/photo.png')
|
||||
const photoMobileImage = path.join(imageRootDir, 'birthday/photo_mobile.png')
|
||||
|
||||
const example = path.join(imageRootDir, 'example.png')
|
||||
const example2 = path.join(imageRootDir, 'example2.jpg')
|
||||
|
||||
export type StoryFeedbackModalType = {};
|
||||
export type StoryGalleryModalType = {};
|
||||
export type StoryInfoModalType = {};
|
||||
export type StoryQuestPlotModalType = {};
|
||||
|
||||
export type StoryModalContent = StoryFeedbackModalType | StoryGalleryModalType | StoryInfoModalType | StoryQuestPlotModalType;
|
||||
export type StoryModalType = 'faq' | 'feedback' | 'gallery' | 'info' | 'questPlot';
|
||||
export type StoryImageType = {
|
||||
alt: string;
|
||||
height?: number;
|
||||
src: string;
|
||||
width?: number;
|
||||
};
|
||||
|
||||
export type StoryType = {
|
||||
border?: {
|
||||
inner?: {
|
||||
color: string;
|
||||
};
|
||||
outer?: {
|
||||
color: string;
|
||||
};
|
||||
};
|
||||
id: string;
|
||||
img: StoryImageType;
|
||||
imgMobile?: StoryImageType;
|
||||
modal: {
|
||||
content?: StoryModalContent;
|
||||
type: StoryModalType;
|
||||
};
|
||||
title?: string;
|
||||
};
|
||||
|
||||
|
||||
|
||||
const birthdayPageStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'faq',
|
||||
},
|
||||
title: 'Ответы\\n на вопросы',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\n и видео',
|
||||
},
|
||||
];
|
||||
const graduationPageStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'faq',
|
||||
},
|
||||
title: 'Ответы\\n на вопросы',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\n и видео',
|
||||
},
|
||||
];
|
||||
const outdoorsPageStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Ответы на вопросы',
|
||||
src: faqMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'faq',
|
||||
},
|
||||
title: 'Ответы\\n на вопросы',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Отзывы наших клиентов',
|
||||
src: feedbackMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'feedback',
|
||||
},
|
||||
title: 'Отзывы\\n наших клиентов',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoImage,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Фотографии и видео',
|
||||
src: photoMobileImage,
|
||||
},
|
||||
modal: {
|
||||
type: 'gallery',
|
||||
},
|
||||
title: 'Фотографии\n и видео',
|
||||
},
|
||||
];
|
||||
|
||||
const homePageStories: StoryType[] = [
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Рекомендации по квестам',
|
||||
src: example,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Рекомендации по квестам',
|
||||
src: example,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'Рекомендации\\n по квестам',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'День Рождения в Arkids парке',
|
||||
src: example2,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'День Рождения в Arkids парке',
|
||||
src: example2,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'День Рождения\\n в Arkids парке',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'Новые программы\\n для праздника',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Рекомендации по квестам',
|
||||
src: example,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Рекомендации по квестам',
|
||||
src: example,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'Рекомендации\\n по квестам',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'День Рождения в Arkids парке',
|
||||
src: example2,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'День Рождения в Arkids парке',
|
||||
src: example2,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'День Рождения\\n в Arkids парке',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'Новые программы\\n для праздника',
|
||||
},
|
||||
{
|
||||
id: uuid(),
|
||||
img: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
imgMobile: {
|
||||
alt: 'Новые программы для праздника',
|
||||
src: example,
|
||||
},
|
||||
modal: {
|
||||
type: 'info',
|
||||
},
|
||||
title: 'Новые программы\\n для праздника',
|
||||
},
|
||||
];
|
||||
|
||||
export const getStories = (req: Request, res: Response) => {
|
||||
// @ts-ignore
|
||||
const {page} = req.body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
return res.status(200).json(birthdayPageStories);
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
return res.status(200).json(graduationPageStories);
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
return res.status(200).json(outdoorsPageStories);
|
||||
}
|
||||
|
||||
case PAGE_LINK.HOME: {
|
||||
return res.status(200).json(homePageStories);
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
10
src/api/routes/stories/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import express, { Request, Response } from 'express';
|
||||
import { getStories } from './controller';
|
||||
|
||||
const storiesRouter = express.Router()
|
||||
|
||||
storiesRouter.post('/', (req: Request, res: Response) => {
|
||||
return getStories(req, res);
|
||||
})
|
||||
|
||||
export default storiesRouter;
|
||||
98
src/api/routes/text/controller.ts
Normal file
@ -0,0 +1,98 @@
|
||||
import { Request, Response } from 'express';
|
||||
import { PAGE_LINK, TextSection } from '../../../constants';
|
||||
|
||||
const birthdayTitleText = {
|
||||
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, тематические программы, '
|
||||
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||
title: 'День Рождения',
|
||||
};
|
||||
|
||||
const graduationTitleText = {
|
||||
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, индивидуальные дипломы, '
|
||||
+ 'творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||
title: 'Выпускной',
|
||||
};
|
||||
|
||||
const outdoorsTitleText = {
|
||||
description: 'Организуем незабываемый праздник в новом формате: выгодные комбо, '
|
||||
+ 'тематические программы, творческие мастер-классы и многое другое ждёт вас в нашем мире развлечений',
|
||||
title: 'Выездной праздник',
|
||||
};
|
||||
|
||||
const questsTitleText = {
|
||||
description: 'Выбираете квест для ребенка? Может, для компании своих друзей/коллег? '
|
||||
+ 'Или просто хотите отдохнуть всей семьей?\\n\\n '
|
||||
+ 'У нас есть решения под любые цели и для любых возрастов!\n',
|
||||
title: 'Квесты',
|
||||
};
|
||||
|
||||
const parkInfo = {
|
||||
text: '-интерактивный парк нового поколения,\n'
|
||||
+ ' объединяющий популярные услуги\n'
|
||||
+ ' и развлечения для детей и взрослых',
|
||||
title: 'Arkids Парк',
|
||||
};
|
||||
|
||||
export const getTitle = (req: Request, res: Response) => {
|
||||
console.log('headers', req.headers);
|
||||
|
||||
// @ts-ignore
|
||||
const body = req.body;
|
||||
console.log('body', body);
|
||||
const { page, section } = body;
|
||||
|
||||
switch (page) {
|
||||
case PAGE_LINK.BIRTHDAY: {
|
||||
switch (section) {
|
||||
case TextSection.TITLE:
|
||||
return res.status(200).json(birthdayTitleText);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
case PAGE_LINK.GRADUATION: {
|
||||
switch (section) {
|
||||
case TextSection.TITLE:
|
||||
return res.status(200).json(graduationTitleText);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
case PAGE_LINK.OUTDOORS: {
|
||||
switch (section) {
|
||||
case TextSection.TITLE:
|
||||
return res.status(200).json(outdoorsTitleText);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
case PAGE_LINK.QUESTS: {
|
||||
switch (section) {
|
||||
case TextSection.TITLE:
|
||||
return res.status(200).json(questsTitleText);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
case PAGE_LINK.HOME: {
|
||||
switch (section) {
|
||||
case TextSection.PARK:
|
||||
return res.status(200).json(parkInfo);
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return res.status(404);
|
||||
}
|
||||
}
|
||||
21
src/api/routes/text/index.ts
Normal file
@ -0,0 +1,21 @@
|
||||
// const express = require('express')
|
||||
|
||||
import express, { NextFunction, Request, Response } from 'express';
|
||||
import { getTitle } from './controller';
|
||||
const router = express.Router()
|
||||
|
||||
// middleware that is specific to this router
|
||||
router.use((req: Request, res: Response, next: NextFunction) => {
|
||||
console.log('Time: ', Date.now())
|
||||
next()
|
||||
})
|
||||
|
||||
router.get('/', (req: Request, res: Response) => {
|
||||
return res.send('Api text GET response')
|
||||
})
|
||||
|
||||
router.post('/', (req: Request, res: Response) => {
|
||||
return getTitle(req, res);
|
||||
})
|
||||
|
||||
export default router;
|
||||
39
src/constants/colors.module.scss
Normal file
@ -0,0 +1,39 @@
|
||||
// Color list
|
||||
$color_veri_peri: #6767AB;
|
||||
$color_veri_peri_dark: #5656A9;
|
||||
$color_orange: #FFB76F;
|
||||
$color_gradient_red: linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%);
|
||||
$color_gradient_red_dark: linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%);
|
||||
$color_gradient_peri: linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%);
|
||||
$color_gradient_peri3: linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%);
|
||||
$color_gradient_peri4: linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%);
|
||||
$color_gradient_peri2: linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%);
|
||||
$color_gradient_yellow: linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%);
|
||||
$color_gradient_orange: linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%);
|
||||
$color_gradient_green: linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%);;
|
||||
$color_white: #FFFFFF;
|
||||
$color_black: #000000;
|
||||
$color_grey: #F1F7FD;
|
||||
$color_green: #15B555;
|
||||
$color_black_light: #3C3C3C;
|
||||
|
||||
:export {
|
||||
veri_peri: $color_veri_peri;
|
||||
veri_peri_dark: $color_veri_peri_dark;
|
||||
orange: $color_orange;
|
||||
gradient_red: $color_gradient_red;
|
||||
gradient_red_dark: $color_gradient_red_dark;
|
||||
gradient_peri: $color_gradient_peri;
|
||||
gradient_peri2: $color_gradient_peri2;
|
||||
gradient_peri3: $color_gradient_peri3;
|
||||
gradient_peri4: $color_gradient_peri4;
|
||||
gradient_yellow: $color_gradient_yellow;
|
||||
gradient_orange: $color_gradient_orange;
|
||||
gradient_green: $color_gradient_green;
|
||||
white: $color_white;
|
||||
black: $color_black;
|
||||
black_light: $color_black_light;
|
||||
grey: $color_grey;
|
||||
green: $color_green;
|
||||
transparent: 'transparent';
|
||||
}
|
||||
224
src/constants/index.ts
Normal file
@ -0,0 +1,224 @@
|
||||
export const enum PAGE_LINK {
|
||||
ABOUT = '/about',
|
||||
BIRTHDAY = '/holidays/birthday',
|
||||
COMBO = '/combo',
|
||||
CONTACTS = '/contacts',
|
||||
COOPERATION = '/cooperation',
|
||||
ESCORT = '/escort',
|
||||
FAQ = '/faq',
|
||||
FEEDBACK = '/feedback',
|
||||
FRANCHISE = '/franchise',
|
||||
GALLERY = '/gallery',
|
||||
GRADUATION = '/holidays/graduation',
|
||||
HOLIDAYS = '/holidays',
|
||||
HOME = '/',
|
||||
MASTER_CLASSES = '/master_classes',
|
||||
NEW_YEAR = '/new_year',
|
||||
OUTDOORS = '/holidays/outdoors',
|
||||
PARTNERS = '/partners',
|
||||
PRICE = '/price',
|
||||
QUESTS = '/quests',
|
||||
RENT = '/rent',
|
||||
SERVICE = '/service',
|
||||
}
|
||||
|
||||
export type PAGE_LINK_LABEL_TYPE = {
|
||||
[key in PAGE_LINK]: string;
|
||||
};
|
||||
|
||||
export const PAGE_LINK_LABEL: PAGE_LINK_LABEL_TYPE = {
|
||||
[PAGE_LINK.ABOUT]: 'О нас',
|
||||
[PAGE_LINK.BIRTHDAY]: 'День Рождения',
|
||||
[PAGE_LINK.HOLIDAYS]: 'Праздники',
|
||||
[PAGE_LINK.HOME]: 'Главная',
|
||||
[PAGE_LINK.COMBO]: 'Комбо',
|
||||
[PAGE_LINK.CONTACTS]: 'Контакты',
|
||||
[PAGE_LINK.COOPERATION]: 'Сотрудничество',
|
||||
[PAGE_LINK.ESCORT]: 'Сопровождение',
|
||||
[PAGE_LINK.FAQ]: 'Частые вопросы',
|
||||
[PAGE_LINK.FEEDBACK]: 'Отзывы',
|
||||
[PAGE_LINK.FRANCHISE]: 'Франшиза',
|
||||
[PAGE_LINK.GRADUATION]: 'Выпускные',
|
||||
[PAGE_LINK.GALLERY]: 'Галерея',
|
||||
[PAGE_LINK.MASTER_CLASSES]: 'Мастер классы',
|
||||
[PAGE_LINK.NEW_YEAR]: 'Новый год',
|
||||
[PAGE_LINK.OUTDOORS]: 'Выездные праздники',
|
||||
[PAGE_LINK.PARTNERS]: 'Корпоративным клиентам и партнёрам',
|
||||
[PAGE_LINK.PRICE]: 'Цены',
|
||||
[PAGE_LINK.QUESTS]: 'Квесты',
|
||||
[PAGE_LINK.RENT]: 'Аренда залов',
|
||||
[PAGE_LINK.SERVICE]: 'Услуги для праздника',
|
||||
};
|
||||
|
||||
export enum TextSection {
|
||||
PARK = 'parkInfo',
|
||||
TITLE = 'title',
|
||||
}
|
||||
|
||||
export enum SERVICE {
|
||||
ANIMATION = 'animation',
|
||||
ANIMATOR = 'animator',
|
||||
CRYO_SHOW = 'cryoShow',
|
||||
DECORATION = 'decoration',
|
||||
DIPLOMA = 'diploma',
|
||||
DURATION = 'duration',
|
||||
FACE_PAINTING = 'facePainting',
|
||||
HALL = 'hall',
|
||||
MASTERCLASS = 'masterclass',
|
||||
PHOTOGRAPHER = 'photographer',
|
||||
PHOTOS = 'photos',
|
||||
QUEST = 'quest',
|
||||
SCREENWRITER = 'screenWriter',
|
||||
SHOW_DISCO = 'showDisco',
|
||||
TABLEWARE_FESTIVE = 'tablewareFestive',
|
||||
TEAM_BUILDING = 'teamBuilding',
|
||||
}
|
||||
|
||||
export type ServiceType = {
|
||||
enabled: boolean;
|
||||
id: SERVICE;
|
||||
name: string;
|
||||
tooltip?: boolean;
|
||||
};
|
||||
|
||||
export enum ApiRoute {
|
||||
BREADCRUMBS = '/breadcrumbs',
|
||||
FAQ = '/faq',
|
||||
HALLS = '/halls',
|
||||
INFO = '/info',
|
||||
QUESTS = '/quests',
|
||||
RATE = '/rate',
|
||||
SERVICES = '/services',
|
||||
STATISTIC_INFO = '/statistic',
|
||||
STORIES = '/stories',
|
||||
TEXT = '/text',
|
||||
}
|
||||
|
||||
export const servicesList: { [k in SERVICE]: ServiceType } = {
|
||||
[SERVICE.QUEST]: {
|
||||
enabled: true,
|
||||
id: SERVICE.QUEST,
|
||||
name: 'Квест',
|
||||
},
|
||||
[SERVICE.ANIMATION]: {
|
||||
enabled: true,
|
||||
id: SERVICE.ANIMATION,
|
||||
name: 'Тематическая анимация',
|
||||
},
|
||||
[SERVICE.DURATION]: {
|
||||
enabled: true,
|
||||
id: SERVICE.DURATION,
|
||||
name: 'Продолжительность',
|
||||
},
|
||||
[SERVICE.ANIMATOR]: {
|
||||
enabled: true,
|
||||
id: SERVICE.ANIMATOR,
|
||||
name: 'Аниматор',
|
||||
},
|
||||
[SERVICE.CRYO_SHOW]: {
|
||||
enabled: true,
|
||||
id: SERVICE.CRYO_SHOW,
|
||||
name: 'Крио-Шоу',
|
||||
},
|
||||
[SERVICE.DECORATION]: {
|
||||
enabled: true,
|
||||
id: SERVICE.DECORATION,
|
||||
name: 'Украшение зала',
|
||||
},
|
||||
[SERVICE.DIPLOMA]: {
|
||||
enabled: true,
|
||||
id: SERVICE.DIPLOMA,
|
||||
name: 'Диплом выпускника',
|
||||
},
|
||||
[SERVICE.FACE_PAINTING]: {
|
||||
enabled: true,
|
||||
id: SERVICE.FACE_PAINTING,
|
||||
name: 'Аква грим',
|
||||
},
|
||||
[SERVICE.HALL]: {
|
||||
enabled: true,
|
||||
id: SERVICE.HALL,
|
||||
name: 'Зал для праздника',
|
||||
tooltip: true,
|
||||
},
|
||||
[SERVICE.MASTERCLASS]: {
|
||||
enabled: true,
|
||||
id: SERVICE.MASTERCLASS,
|
||||
name: 'Мастер класс',
|
||||
},
|
||||
[SERVICE.PHOTOGRAPHER]: {
|
||||
enabled: true,
|
||||
id: SERVICE.PHOTOGRAPHER,
|
||||
name: 'Фотограф',
|
||||
},
|
||||
[SERVICE.PHOTOS]: {
|
||||
enabled: true,
|
||||
id: SERVICE.PHOTOS,
|
||||
name: 'Фотографии',
|
||||
},
|
||||
[SERVICE.SCREENWRITER]: {
|
||||
enabled: true,
|
||||
id: SERVICE.SCREENWRITER,
|
||||
name: 'Сценарист',
|
||||
},
|
||||
[SERVICE.SHOW_DISCO]: {
|
||||
enabled: true,
|
||||
id: SERVICE.SHOW_DISCO,
|
||||
name: 'Шоу дискотека',
|
||||
},
|
||||
[SERVICE.TABLEWARE_FESTIVE]: {
|
||||
enabled: true,
|
||||
id: SERVICE.TABLEWARE_FESTIVE,
|
||||
name: 'Праздничная посуда',
|
||||
},
|
||||
[SERVICE.TEAM_BUILDING]: {
|
||||
enabled: true,
|
||||
id: SERVICE.TEAM_BUILDING,
|
||||
name: 'Тимбилдинг',
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
export enum ColorVariant {
|
||||
BLACK,
|
||||
BLACK_LIGHT,
|
||||
GRADIENT_PERI,
|
||||
GRADIENT_PERI2,
|
||||
GRADIENT_PERI3,
|
||||
GRADIENT_PERI4,
|
||||
GRADIENT_RED,
|
||||
GRADIENT_RED_DARK,
|
||||
GRADIENT_YELLOW,
|
||||
GRADIENT_ORANGE,
|
||||
GRADIENT_GREEN,
|
||||
GREEN,
|
||||
GREY,
|
||||
ORANGE,
|
||||
TRANSPARENT,
|
||||
VERI_PERI,
|
||||
VERI_PERI_DARK,
|
||||
WHITE,
|
||||
}
|
||||
type ColorType = {
|
||||
[k in ColorVariant]: string;
|
||||
};
|
||||
export const COLORS: ColorType = {
|
||||
[ColorVariant.BLACK]: "#000000",
|
||||
[ColorVariant.BLACK_LIGHT]: "#3C3C3C",
|
||||
[ColorVariant.GRADIENT_PERI]: "linear-gradient(120.58deg, #33CC99 7.16%, #9966FF 92.98%)",
|
||||
[ColorVariant.GRADIENT_PERI2]: "linear-gradient(134.56deg, #6767AB 11.78%, #FF3399 84.81%)",
|
||||
[ColorVariant.GRADIENT_PERI3]: "linear-gradient(118.78deg, #9966FF 23.28%, #33CC99 97.07%)",
|
||||
[ColorVariant.GRADIENT_PERI4]: "linear-gradient(120.58deg, #968CE0 7.16%, #3748AA 92.98%)",
|
||||
[ColorVariant.GRADIENT_RED]: "linear-gradient(134.56deg, #FF5C00 11.78%, #FF3399 84.81%)",
|
||||
[ColorVariant.GRADIENT_RED_DARK]: "linear-gradient(134.56deg, #FF5F04 11.78%, #FE007F 84.81%)",
|
||||
[ColorVariant.GRADIENT_YELLOW]: "linear-gradient(154.56deg, #FDF041 -35.9%, #FBAB01 129.39%)",
|
||||
[ColorVariant.GRADIENT_ORANGE]: "linear-gradient(135.23deg, #FFB76F 20.94%, #FB5858 75.76%)",
|
||||
[ColorVariant.GRADIENT_GREEN]: "linear-gradient(120.58deg, #E9CA26 12.53%, #33CC99 92.98%)",
|
||||
[ColorVariant.GREEN]: "#15B555",
|
||||
[ColorVariant.GREY]: "#F1F7FD",
|
||||
[ColorVariant.ORANGE]: "#FFB76F",
|
||||
[ColorVariant.TRANSPARENT]: 'transparent',
|
||||
[ColorVariant.VERI_PERI]: "#6767AB",
|
||||
[ColorVariant.VERI_PERI_DARK]: "#5656A9",
|
||||
[ColorVariant.WHITE]: "#FFFFFF",
|
||||
};
|
||||
BIN
static/images/information/halls/hall1.jpg
Normal file
|
After Width: | Height: | Size: 414 KiB |
BIN
static/images/information/halls/hall2.jpg
Normal file
|
After Width: | Height: | Size: 272 KiB |
BIN
static/images/information/halls/hall3.jpg
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
static/images/information/statistics/desktop/decoration.png
Normal file
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
BIN
static/images/information/statistics/desktop/graduation/kids.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
static/images/information/statistics/desktop/graduation/rate.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/images/information/statistics/desktop/kids.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
static/images/information/statistics/desktop/like.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 9.8 KiB |
BIN
static/images/information/statistics/desktop/pinata.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
static/images/information/statistics/desktop/programms.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/desktop/quests/eger/map.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
static/images/information/statistics/desktop/rate.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
static/images/information/statistics/desktop/star.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
BIN
static/images/information/statistics/mobile/cup.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/decoration.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 8.5 KiB |
|
After Width: | Height: | Size: 13 KiB |
BIN
static/images/information/statistics/mobile/graduation/kids.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/graduation/rate.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/kids.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/information/statistics/mobile/kids2.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/information/statistics/mobile/like.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
BIN
static/images/information/statistics/mobile/outdoors/scooter.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
static/images/information/statistics/mobile/pinata.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
static/images/information/statistics/mobile/programms.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
|
After Width: | Height: | Size: 21 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/keys.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/kids.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/information/statistics/mobile/quests/eger/map.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
static/images/information/statistics/mobile/rate.png
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
static/images/information/statistics/mobile/star.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
static/images/quests/backgrounds/eger/desktop/background.png
Normal file
|
After Width: | Height: | Size: 759 KiB |
BIN
static/images/quests/backgrounds/eger/mobile/background.png
Normal file
|
After Width: | Height: | Size: 245 KiB |
BIN
static/images/quests/backgrounds/faraon/desktop/background.png
Normal file
|
After Width: | Height: | Size: 660 KiB |
BIN
static/images/quests/backgrounds/faraon/mobile/background.png
Normal file
|
After Width: | Height: | Size: 183 KiB |
BIN
static/images/quests/backgrounds/main/desktop/eger-card.png
Normal file
|
After Width: | Height: | Size: 308 KiB |
BIN
static/images/quests/backgrounds/main/desktop/faraon-card.png
Normal file
|
After Width: | Height: | Size: 200 KiB |
BIN
static/images/quests/backgrounds/main/desktop/mult-card.png
Normal file
|
After Width: | Height: | Size: 307 KiB |
BIN
static/images/quests/backgrounds/main/desktop/quests.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
static/images/quests/backgrounds/main/mobile/eger-card.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
static/images/quests/backgrounds/main/mobile/faraon-card.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
static/images/quests/backgrounds/main/mobile/mult-card.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
static/images/quests/backgrounds/main/mobile/quests.png
Normal file
|
After Width: | Height: | Size: 335 KiB |
BIN
static/images/quests/backgrounds/mult/desktop/background.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
static/images/quests/backgrounds/mult/mobile/background.png
Normal file
|
After Width: | Height: | Size: 339 KiB |
BIN
static/images/quests/stories/eger/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
static/images/quests/stories/eger/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
static/images/quests/stories/eger/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
static/images/quests/stories/eger/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
static/images/quests/stories/eger/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
static/images/quests/stories/eger/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
static/images/quests/stories/faraon/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 104 KiB |
BIN
static/images/quests/stories/faraon/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
static/images/quests/stories/faraon/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
static/images/quests/stories/faraon/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
static/images/quests/stories/faraon/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
static/images/quests/stories/faraon/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
static/images/quests/stories/mult/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
static/images/quests/stories/mult/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
static/images/quests/stories/mult/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
static/images/quests/stories/mult/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/quests/stories/mult/mobile/gallery.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
static/images/quests/stories/mult/mobile/plot.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/feedback.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/gallery.png
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
static/images/quests/stories/stories/eger/desktop/plot.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
static/images/quests/stories/stories/eger/mobile/feedback.png
Normal file
|
After Width: | Height: | Size: 25 KiB |