Compare commits
3 Commits
aa00542a03
...
2eabca5a31
Author | SHA1 | Date | |
---|---|---|---|
2eabca5a31 | |||
50ce471623 | |||
|
52e78d4ea5 |
22
.gitignore
vendored
22
.gitignore
vendored
@ -1 +1,23 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
node_modules
|
node_modules
|
||||||
|
/.pnp
|
||||||
|
.pnp.js
|
||||||
|
|
||||||
|
# testing
|
||||||
|
/coverage
|
||||||
|
|
||||||
|
# production
|
||||||
|
/build
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
.env.local
|
||||||
|
.env.development.local
|
||||||
|
.env.test.local
|
||||||
|
.env.production.local
|
||||||
|
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
@ -1,56 +0,0 @@
|
|||||||
variables:
|
|
||||||
- &node_image 'node:18-alpine3.18'
|
|
||||||
- &branch 'master'
|
|
||||||
|
|
||||||
when:
|
|
||||||
- event: push
|
|
||||||
branch: *branch
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Install server dependencies
|
|
||||||
image: *node_image
|
|
||||||
commands:
|
|
||||||
- cd server
|
|
||||||
- yarn install --frozen-lockfile
|
|
||||||
- name: Install client dependencies
|
|
||||||
image: *node_image
|
|
||||||
commands:
|
|
||||||
- cd client
|
|
||||||
- yarn install --frozen-lockfile
|
|
||||||
- name: Build server
|
|
||||||
depends_on: [Install server dependencies]
|
|
||||||
image: *node_image
|
|
||||||
commands:
|
|
||||||
- cd server
|
|
||||||
- yarn build
|
|
||||||
- name: Build client
|
|
||||||
depends_on: [Install client dependencies]
|
|
||||||
image: *node_image
|
|
||||||
commands:
|
|
||||||
- cd client
|
|
||||||
- yarn build
|
|
||||||
- name: Build Docker image
|
|
||||||
depends_on: [Build server, Build client]
|
|
||||||
image: woodpeckerci/plugin-docker-buildx
|
|
||||||
settings:
|
|
||||||
dockerfile: Dockerfile-Woodpecker
|
|
||||||
platforms: linux/amd64
|
|
||||||
registry:
|
|
||||||
from_secret: REPO_URL
|
|
||||||
username:
|
|
||||||
from_secret: REPO_USERNAME
|
|
||||||
password:
|
|
||||||
from_secret: REPO_PASSWORD
|
|
||||||
repo:
|
|
||||||
from_secret: REPO_NAME
|
|
||||||
- name: Discord notification - build
|
|
||||||
image: appleboy/drone-discord
|
|
||||||
depends_on: [Build Docker image]
|
|
||||||
when:
|
|
||||||
- status: [success, failure]
|
|
||||||
settings:
|
|
||||||
webhook_id:
|
|
||||||
from_secret: DISCORD_WEBHOOK_ID
|
|
||||||
webhook_token:
|
|
||||||
from_secret: DISCORD_WEBHOOK_TOKEN
|
|
||||||
message: "{{#success build.status}}✅ Sestavení {{build.number}} proběhlo úspěšně.{{else}}❌ Sestavení {{build.number}} selhalo.{{/success}}\n\nPipeline: {{build.link}}\nPoslední commit: {{commit.message}}Autor: {{commit.author}}"
|
|
@ -54,6 +54,7 @@ WORKDIR /app
|
|||||||
# Vykopírování sestaveného serveru
|
# Vykopírování sestaveného serveru
|
||||||
COPY --from=builder /build/server/node_modules ./server/node_modules
|
COPY --from=builder /build/server/node_modules ./server/node_modules
|
||||||
COPY --from=builder /build/server/dist ./
|
COPY --from=builder /build/server/dist ./
|
||||||
|
COPY server/resources ./server/resources
|
||||||
|
|
||||||
# Vykopírování sestaveného klienta
|
# Vykopírování sestaveného klienta
|
||||||
COPY --from=builder /build/client/dist ./public
|
COPY --from=builder /build/client/dist ./public
|
||||||
@ -62,10 +63,8 @@ COPY --from=builder /build/client/dist ./public
|
|||||||
COPY /server/.env.production ./server/src
|
COPY /server/.env.production ./server/src
|
||||||
|
|
||||||
# Zkopírování konfigurace easter eggů
|
# Zkopírování konfigurace easter eggů
|
||||||
RUN if [ -f /server/.easter-eggs.json ]; then cp /server/.easter-eggs.json ./server/; fi
|
# TODO tohle spadne když nebude existovat!
|
||||||
|
COPY /server/.easter-eggs.json ./server/
|
||||||
# Export /data/db.json do složky /data
|
|
||||||
VOLUME ["/data"]
|
|
||||||
|
|
||||||
EXPOSE 3000
|
EXPOSE 3000
|
||||||
|
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
FROM node:18-alpine3.18
|
|
||||||
ENV LANG=cs_CZ.UTF-8
|
|
||||||
ENV NODE_ENV=production
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# Vykopírování sestaveného serveru
|
|
||||||
COPY ./server/node_modules ./server/node_modules
|
|
||||||
COPY ./server/dist ./
|
|
||||||
# TODO tohle není dobře, má to být součástí serveru
|
|
||||||
# COPY ./server/resources ./resources
|
|
||||||
|
|
||||||
# Vykopírování sestaveného klienta
|
|
||||||
COPY ./client/dist ./public
|
|
||||||
|
|
||||||
# Zkopírování konfigurace easter eggů
|
|
||||||
RUN if [ -f ./server/.easter-eggs.json ]; then cp ./server/.easter-eggs.json ./server/; fi
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD [ "node", "./server/src/index.js" ]
|
|
1
client/.gitignore
vendored
1
client/.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
build
|
build
|
||||||
dist
|
dist
|
||||||
|
src/types
|
@ -31,8 +31,9 @@
|
|||||||
"vite-tsconfig-paths": "^5.1.4"
|
"vite-tsconfig-paths": "^5.1.4"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "yarn vite",
|
"copy-types": "cp -r ../types ./src",
|
||||||
"build": "yarn vite build"
|
"start": "yarn copy-types && vite",
|
||||||
|
"build": "yarn copy-types && vite build"
|
||||||
},
|
},
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": [
|
"extends": [
|
||||||
|
@ -8,12 +8,13 @@ import { Alert, Button, Col, Form, Row, Table } from 'react-bootstrap';
|
|||||||
import Header from './components/Header';
|
import Header from './components/Header';
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
import PizzaOrderList from './components/PizzaOrderList';
|
import PizzaOrderList from './components/PizzaOrderList';
|
||||||
import SelectSearch, {SelectedOptionValue, SelectSearchOption} from 'react-select-search';
|
import SelectSearch, { SelectedOptionValue } from 'react-select-search';
|
||||||
import 'react-select-search/style.css';
|
import 'react-select-search/style.css';
|
||||||
import './App.scss';
|
import './App.scss';
|
||||||
|
import { SelectSearchOption } from 'react-select-search';
|
||||||
import { faCircleCheck, faNoteSticky, faTrashCan } from '@fortawesome/free-regular-svg-icons';
|
import { faCircleCheck, faNoteSticky, faTrashCan } from '@fortawesome/free-regular-svg-icons';
|
||||||
import { useSettings } from './context/settings';
|
import { useSettings } from './context/settings';
|
||||||
import { ClientData, Restaurants, Food, Order, Locations, PizzaOrder, PizzaDayState, FoodChoices, DayMenu, DepartureTime, LocationKey } from '../../types';
|
import { ClientData, Restaurants, Food, Order, Locations, PizzaOrder, PizzaDayState, FoodChoices, DayMenu, DepartureTime, LocationKey } from './types';
|
||||||
import Footer from './components/Footer';
|
import Footer from './components/Footer';
|
||||||
import { faChainBroken, faChevronLeft, faChevronRight, faGear, faSatelliteDish, faSearch } from '@fortawesome/free-solid-svg-icons';
|
import { faChainBroken, faChevronLeft, faChevronRight, faGear, faSatelliteDish, faSearch } from '@fortawesome/free-solid-svg-icons';
|
||||||
import Loader from './components/Loader';
|
import Loader from './components/Loader';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { EasterEgg } from "../../../types";
|
import { EasterEgg } from "../types";
|
||||||
import { api } from "./Api";
|
import { api } from "./Api";
|
||||||
|
|
||||||
const EASTER_EGGS_API_PREFIX = '/api/easterEggs';
|
const EASTER_EGGS_API_PREFIX = '/api/easterEggs';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { AddChoiceRequest, ChangeDepartureTimeRequest, LocationKey, RemoveChoiceRequest, RemoveChoicesRequest, UpdateNoteRequest } from "../../../types";
|
import { AddChoiceRequest, ChangeDepartureTimeRequest, LocationKey, RemoveChoiceRequest, RemoveChoicesRequest, UpdateNoteRequest } from "../types";
|
||||||
import { api } from "./Api";
|
import { api } from "./Api";
|
||||||
|
|
||||||
const FOOD_API_PREFIX = '/api/food';
|
const FOOD_API_PREFIX = '/api/food';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { AddPizzaRequest, FinishDeliveryRequest, PizzaOrder, RemovePizzaRequest, UpdatePizzaDayNoteRequest, UpdatePizzaFeeRequest } from "../../../types";
|
import { AddPizzaRequest, FinishDeliveryRequest, PizzaOrder, RemovePizzaRequest, UpdatePizzaDayNoteRequest, UpdatePizzaFeeRequest } from "../types";
|
||||||
import { api } from "./Api";
|
import { api } from "./Api";
|
||||||
|
|
||||||
const PIZZADAY_API_PREFIX = '/api/pizzaDay';
|
const PIZZADAY_API_PREFIX = '/api/pizzaDay';
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FeatureRequest, UpdateFeatureVoteRequest } from "../../../types";
|
import { FeatureRequest, UpdateFeatureVoteRequest } from "../types";
|
||||||
import { api } from "./Api";
|
import { api } from "./Api";
|
||||||
|
|
||||||
const VOTING_API_PREFIX = '/api/voting';
|
const VOTING_API_PREFIX = '/api/voting';
|
||||||
|
@ -4,7 +4,7 @@ import { useAuth } from "../context/auth";
|
|||||||
import SettingsModal from "./modals/SettingsModal";
|
import SettingsModal from "./modals/SettingsModal";
|
||||||
import { useSettings } from "../context/settings";
|
import { useSettings } from "../context/settings";
|
||||||
import FeaturesVotingModal from "./modals/FeaturesVotingModal";
|
import FeaturesVotingModal from "./modals/FeaturesVotingModal";
|
||||||
import { FeatureRequest } from "../../../types";
|
import { FeatureRequest } from "../types";
|
||||||
import { errorHandler } from "../api/Api";
|
import { errorHandler } from "../api/Api";
|
||||||
import { getFeatureVotes, updateFeatureVote } from "../api/VotingApi";
|
import { getFeatureVotes, updateFeatureVote } from "../api/VotingApi";
|
||||||
import PizzaCalculatorModal from "./modals/PizzaCalculatorModal";
|
import PizzaCalculatorModal from "./modals/PizzaCalculatorModal";
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Table } from "react-bootstrap";
|
import { Table } from "react-bootstrap";
|
||||||
import { Order, PizzaDayState, PizzaOrder } from "../../../types";
|
import { Order, PizzaDayState, PizzaOrder } from "../types";
|
||||||
import PizzaOrderRow from "./PizzaOrderRow";
|
import PizzaOrderRow from "./PizzaOrderRow";
|
||||||
import { updatePizzaFee } from "../api/PizzaDayApi";
|
import { updatePizzaFee } from "../api/PizzaDayApi";
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import React, { useState } from "react";
|
|||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { faMoneyBill1, faTrashCan } from "@fortawesome/free-regular-svg-icons";
|
import { faMoneyBill1, faTrashCan } from "@fortawesome/free-regular-svg-icons";
|
||||||
import { useAuth } from "../context/auth";
|
import { useAuth } from "../context/auth";
|
||||||
import { Order, PizzaDayState, PizzaOrder } from "../../../types";
|
import { Order, PizzaDayState, PizzaOrder } from "../types";
|
||||||
import PizzaAdditionalFeeModal from "./modals/PizzaAdditionalFeeModal";
|
import PizzaAdditionalFeeModal from "./modals/PizzaAdditionalFeeModal";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Modal, Button, Form } from "react-bootstrap"
|
import { Modal, Button, Form } from "react-bootstrap"
|
||||||
import { FeatureRequest } from "../../../../types";
|
import { FeatureRequest } from "../../types";
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
isOpen: boolean,
|
isOpen: boolean,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import { getEasterEgg } from "../api/EasterEggApi";
|
import { getEasterEgg } from "../api/EasterEggApi";
|
||||||
import { AuthContextProps } from "./auth";
|
import { AuthContextProps } from "./auth";
|
||||||
import { EasterEgg } from "../../../types";
|
import { EasterEgg } from "../types";
|
||||||
|
|
||||||
export const useEasterEgg = (auth?: AuthContextProps | null): [EasterEgg | undefined, boolean] => {
|
export const useEasterEgg = (auth?: AuthContextProps | null): [EasterEgg | undefined, boolean] => {
|
||||||
const [result, setResult] = useState<EasterEgg | undefined>();
|
const [result, setResult] = useState<EasterEgg | undefined>();
|
||||||
|
4
server/.gitignore
vendored
4
server/.gitignore
vendored
@ -1,5 +1,7 @@
|
|||||||
|
/node_modules
|
||||||
/dist
|
/dist
|
||||||
/resources/easterEggs
|
data.json
|
||||||
.env.production
|
.env.production
|
||||||
.env.development
|
.env.development
|
||||||
.easter-eggs.json
|
.easter-eggs.json
|
||||||
|
/resources/easterEggs
|
@ -100,11 +100,9 @@ app.use("/api/", (req, res, next) => {
|
|||||||
const emailHeader = req.header('remote-email');
|
const emailHeader = req.header('remote-email');
|
||||||
if (userHeader !== undefined && nameHeader !== undefined) {
|
if (userHeader !== undefined && nameHeader !== undefined) {
|
||||||
const remoteName = Buffer.from(nameHeader, 'latin1').toString();
|
const remoteName = Buffer.from(nameHeader, 'latin1').toString();
|
||||||
if (ENVIRONMENT !== "production"){
|
|
||||||
console.log("Tvuj username, name a email: %s, %s, %s.", userHeader, remoteName, emailHeader);
|
console.log("Tvuj username, name a email: %s, %s, %s.", userHeader, remoteName, emailHeader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if (!req.headers.authorization) {
|
if (!req.headers.authorization) {
|
||||||
return res.status(401).json({ error: 'Nebyl předán autentizační token' });
|
return res.status(401).json({ error: 'Nebyl předán autentizační token' });
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,8 @@
|
|||||||
import JSONdb from 'simple-json-db';
|
import JSONdb from 'simple-json-db';
|
||||||
import { StorageInterface } from "./StorageInterface";
|
import { StorageInterface } from "./StorageInterface";
|
||||||
import * as fs from 'fs';
|
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
const dbPath = path.resolve(__dirname, '../../data/db.json');
|
const db = new JSONdb('./data.json');
|
||||||
const dbDir = path.dirname(dbPath);
|
|
||||||
|
|
||||||
// Zajistěte, že adresář existuje
|
|
||||||
if (!fs.existsSync(dbDir)) {
|
|
||||||
fs.mkdirSync(dbDir, { recursive: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
const db = new JSONdb(dbPath);
|
|
||||||
/**
|
/**
|
||||||
* Implementace úložiště používající JSON soubor.
|
* Implementace úložiště používající JSON soubor.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user