init commit

This commit is contained in:
prod-tech
2024-11-17 02:31:42 +03:00
commit cf933c770c
217 changed files with 19340 additions and 0 deletions
+2
View File
@@ -0,0 +1,2 @@
node_modules
dist
+30
View File
@@ -0,0 +1,30 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
openapi.json
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
/playwright/.auth/
+1
View File
@@ -0,0 +1 @@
20
+23
View File
@@ -0,0 +1,23 @@
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:20 AS build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
ARG VITE_API_URL=${VITE_API_URL}
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1
COPY --from=build-stage /app/dist/ /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./nginx-backend-not-found.conf /etc/nginx/extra-conf.d/backend-not-found.conf
+33
View File
@@ -0,0 +1,33 @@
{
"$schema": "https://biomejs.dev/schemas/1.6.1/schema.json",
"organizeImports": {
"enabled": true
},
"files": {
"ignore": [
"node_modules"
]
},
"linter": {
"enabled": true,
"rules": {
"recommended": true,
"suspicious": {
"noExplicitAny": "off",
"noArrayIndexKey": "off"
},
"style": {
"noNonNullAssertion": "off"
}
}
},
"formatter": {
"indentStyle": "space"
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"semicolons": "asNeeded"
}
}
}
BIN
View File
Binary file not shown.
+21
View File
@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "tailwind.config.js",
"css": "src/app/main.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/shared",
"utils": "@/lib/utils",
"ui": "@/shared/ui",
"lib": "@/shared/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}
+31
View File
@@ -0,0 +1,31 @@
import { $ } from 'bun'
import {writeFileSync} from "node:fs";
const main = async () => {
const res = await fetch('https://{{sensitive_data}}/openapi.json')
let openapi = await res.json()
openapi.paths = Object.fromEntries(Object.entries(openapi.paths).map(([key, value]) => {
value = Object.fromEntries(Object.entries(value).map(([key, value]) => {
value.responses = Object.fromEntries(Object.entries(value.responses).map(([key, value]) => {
if (value['detail']) {
delete value['detail'];
}
return [key, value]
}))
return [key, value]
}))
return [key, value]
}))
writeFileSync('./openapi.json', JSON.stringify(openapi, null, 2))
await $`bun run generate`
}
main()
+14
View File
@@ -0,0 +1,14 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>CoPay</title>
<!-- <link rel="icon" type="image/x-icon" href="/assets/images/favicon.png" />-->
</head>
<body>
<div id="root" class="transition-all"></div>
<script type="module" src="./src/main.tsx"></script>
<script src="https://telegram.org/js/telegram-web-app.js"></script>
</body>
</html>
+9
View File
@@ -0,0 +1,9 @@
location /api {
return 404;
}
location /docs {
return 404;
}
location /redoc {
return 404;
}
+11
View File
@@ -0,0 +1,11 @@
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html =404;
}
include /etc/nginx/extra-conf.d/*.conf;
}
+7
View File
@@ -0,0 +1,7 @@
{
"$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json",
"spaces": 2,
"generator-cli": {
"version": "7.9.0"
}
}
+7445
View File
File diff suppressed because it is too large Load Diff
+52
View File
@@ -0,0 +1,52 @@
{
"name": "frontend",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "biome check --apply-unsafe --no-errors-on-unmatched --files-ignore-unknown=true ./",
"preview": "vite preview",
"generate-client": "openapi-ts --input ./openapi.json --output ./src/shared/api --client axios --exportSchemas true",
"generate": "openapi-generator-cli generate -g typescript-fetch -i ./openapi.json -o ./src/shared/api/generated"
},
"dependencies": {
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-scroll-area": "^1.2.0",
"@radix-ui/react-slot": "^1.1.0",
"@tanstack/react-query": "^5.59.20",
"@tanstack/react-query-devtools": "^5.59.20",
"@tma.js/sdk": "^2.7.0",
"@vkruglikov/react-telegram-web-app": "^2.1.9",
"@yudiel/react-qr-scanner": "^2.0.8",
"axios": "^1.7.7",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"lucide-react": "^0.456.0",
"qrcode": "^1.5.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.1.2",
"react-hook-form": "7.49.3",
"react-router-dom": "^6.28.0",
"tailwind-merge": "^2.5.4",
"tailwindcss-animate": "^1.0.7"
},
"devDependencies": {
"@biomejs/biome": "1.6.1",
"@hey-api/openapi-ts": "^0.55.1",
"@types/bun": "^1.1.13",
"@types/node": "^20.17.6",
"@types/qrcode": "^1.5.5",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.7.1",
"autoprefixer": "^10.4.20",
"dotenv": "^16.4.5",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.14",
"typescript": "^5.6.3",
"vite": "^5.4.10"
}
}
+6
View File
@@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}
@@ -0,0 +1,27 @@
.add-button {
border: none;
outline: none;
background-color: #ece6f0;
color: #65558f;
width: 128px;
height: 56px;
font-size: 14px;
padding: 16px 20px 16px 16px;
display: flex;
gap: 14px;
align-items: center;
margin-right: auto;
margin-left: auto;
box-shadow: 1px 3px 7px 1px rgba(34, 60, 80, 0.2);
border-radius: 16px;
-webkit-border-radius: 16px;
-moz-border-radius: 16px;
-ms-border-radius: 16px;
-o-border-radius: 16px;
}
.plus-icon {
width: 20px;
height: 20px;
}
@@ -0,0 +1,20 @@
import { useNavigate } from 'react-router-dom';
import './AddButton.css';
interface Props {
navigateTo: string;
text: string
}
const AddButton = ({navigateTo, text}: Props) => {
const navigate = useNavigate()
return (
<button className='add-button absolute bottom-14 left-0 right-0' onClick={() => navigate(navigateTo)}>
<svg className='plus-icon' viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" xmlBase="http://www.bohemiancoding.com/sketch/ns" fill="#65558f"><g id="SVGRepo_bgCarrier" strokeWidth="0"></g><g id="SVGRepo_tracerCarrier" strokeLinecap="round" strokeLinejoin="round"></g><g id="SVGRepo_iconCarrier"> <title>plus-circle</title> <desc>Created with Sketch Beta.</desc> <defs> </defs> <g id="Page-1" strokeWidth="0.00032" fill="none" fillRule="evenodd" type="MSPage"> <g id="Icon-Set" type="MSLayerGroup" transform="translate(-464.000000, -1087.000000)" fill="#65558f"> <path d="M480,1117 C472.268,1117 466,1110.73 466,1103 C466,1095.27 472.268,1089 480,1089 C487.732,1089 494,1095.27 494,1103 C494,1110.73 487.732,1117 480,1117 L480,1117 Z M480,1087 C471.163,1087 464,1094.16 464,1103 C464,1111.84 471.163,1119 480,1119 C488.837,1119 496,1111.84 496,1103 C496,1094.16 488.837,1087 480,1087 L480,1087 Z M486,1102 L481,1102 L481,1097 C481,1096.45 480.553,1096 480,1096 C479.447,1096 479,1096.45 479,1097 L479,1102 L474,1102 C473.447,1102 473,1102.45 473,1103 C473,1103.55 473.447,1104 474,1104 L479,1104 L479,1109 C479,1109.55 479.447,1110 480,1110 C480.553,1110 481,1109.55 481,1109 L481,1104 L486,1104 C486.553,1104 487,1103.55 487,1103 C487,1102.45 486.553,1102 486,1102 L486,1102 Z" id="plus-circle" type="MSShapeGroup"> </path> </g> </g> </g></svg>
<span className='ibm-plex-sans-semibold'>{text}</span>
</button>
)
}
export default AddButton
@@ -0,0 +1,30 @@
import React, { useState } from 'react'
import './AddCheckButton.css'
const AddCheckButton = () => {
const [selectedImage, setSelectedImage] = useState<string | null>(null);
const handleImageChange = (event: React.ChangeEvent<HTMLInputElement>) => {
const file = event.target.files?.[0];
if (file) {
const reader = new FileReader();
reader.onloadend = () => {
setSelectedImage(reader.result as string)
};
reader.readAsDataURL(file)
}
};
return (
<div className='goods-buttons'>
<input
type="file"
accept="image/*"
capture="environment"
onChange={handleImageChange}
/>
</div>
)
}
export default AddCheckButton
@@ -0,0 +1,17 @@
import React from 'react'
import './AddGoodsButton.css'
interface Props {
OnClick: () => void
}
const AddGoodsButton = ({OnClick}: Props) => {
return (
<button onClick={OnClick}>
<div className="plus"></div>
<span>Товар</span>
</button>
)
}
export default AddGoodsButton
@@ -0,0 +1,88 @@
.create-group-form {
margin-left: auto;
margin-right: auto;
width: max-content;
height: max-content;
}
.create-group-form input {
outline: none;
padding: 12px 16px;
margin-top: 37px;
border: #8a858e solid 1px;
border-radius: 4px;
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
-ms-border-radius: 4px;
-o-border-radius: 4px;
transition: 0.3s;
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
}
.create-group-form input:invalid::placeholder {
color: #cb1b1b;
}
.create-group-form input:invalid {
border: #cb1b1b solid 1px;
}
.create-group-form .submit-button {
position: absolute;
bottom: 100px;
left: 143px;
width: 128px;
height: 56px;
padding: 16px;
color: #65558f;
background-color: #ece6f0;
display: flex;
gap: 15px;
align-items: center;
box-shadow: 1px 3px 7px 1px rgba(34, 60, 80, 0.2);
transition: 0.3s;
-webkit-transition: 0.3s;
-moz-transition: 0.3s;
-ms-transition: 0.3s;
-o-transition: 0.3s;
border-radius: 16px;
-webkit-border-radius: 16px;
-moz-border-radius: 16px;
-ms-border-radius: 16px;
-o-border-radius: 16px;
}
.wrapper .back {
position: absolute;
bottom: 100px;
left: 24px;
width: 56px;
height: 56px;
background-color: #ece6f0;
display: flex;
align-items: center;
justify-content: center;
color: #65558f;
font-size: 20px;
box-shadow: 1px 3px 7px 1px rgba(34, 60, 80, 0.2);
border-radius: 50%;
-webkit-border-radius: 50%;
-moz-border-radius: 50%;
-ms-border-radius: 50%;
-o-border-radius: 50%;
}
.submit-button:disabled {
background-color: #a09ca8;
color: #e8def8;
}
.plus-icon:disabled {
background-color: #a09ca8;
color: #e8def8;
}
@@ -0,0 +1,63 @@
import React, { useState } from "react";
import "./CreateGroup.css";
import { defaultReq, eventsApi } from "../../shared/api";
import { ChevronLeft, LucideArrowLeft } from "lucide-react";
import { useNavigate } from "react-router-dom";
const CreateGroup = () => {
const navigate = useNavigate();
const [name, setName] = useState("");
const [state, setState] = useState<"idle" | "pending" | "success" | "error">(
"idle"
);
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setName(e.target.value);
};
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
try {
setState("pending");
await eventsApi.createEventApiEventsPost(
{ baseEvent: { name } },
defaultReq
);
setState("idle");
navigate("/");
} catch (error) {
localStorage.removeItem("token");
setState("idle");
}
};
return (
<form className="create-group-form w-full" onSubmit={handleSubmit}>
<input
required
className="w-full"
type="text"
placeholder="Название"
value={name}
onChange={handleChange}
/>
<div className="flex gap-2 items-center">
<div className="absolute left-0 right-0 bottom-[40px] mx-auto">
<div className="flex items-center gap-2 mx-auto justify-center">
<button className='shadow-[1px_3px_7px_1px_rgba(34,_60,_80,_0.2)] bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl' onClick={() => navigate('/')}>
<LucideArrowLeft />
</button>
<button type="submit" className="shadow-[1px_3px_7px_1px_rgba(34,_60,_80,_0.2)] bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl" disabled={!name}>
<span>{state === "idle" || state === 'success' ? "Создать" : (
state === 'pending' ? 'Загрузка...' : 'Успешно!'
)}</span>
</button>
{state === 'error' && <div className="error mt[15px]">Произошла ошибка, попробуйте ещё раз</div>}
</div>
</div>
</div>
</form>
);
};
export default CreateGroup;
@@ -0,0 +1,54 @@
import { FC, useState } from "react";
import { Dialog, DialogContent, DialogHeader } from "../shared/ui/dialog";
import { Input } from "../shared/ui/input";
import React from "react";
import { User } from "../shared/api/generated";
import { transactionsApi } from "../shared/api";
import { Button } from "../shared/ui/button";
import { QueryClient } from "@tanstack/react-query";
import { queryClient } from "../app";
import { useNavigate } from "react-router-dom";
export interface ModalProps {
isOpen: boolean;
onClose: () => void;
eventId: string;
}
export const CreateTransactionModal: FC<ModalProps> = ({ isOpen, onClose, eventId }) => {
const [title, setTitle] = useState('')
const navigate = useNavigate()
const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault()
console.log(title)
try {
await transactionsApi.createTransactionApiTransactionEventIdPost({
eventId,
body: title
})
navigate(`/events/${eventId}`, {replace: true})
} catch (error) {
console.error(error)
} finally {
queryClient.invalidateQueries({queryKey: ["transaction", eventId]})
onClose()
}
}
return (
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent>
<DialogHeader>Создать новую транзакцию</DialogHeader>
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="title">Название</label>
<Input id='title' value={title} onChange={e => setTitle(e.target.value)} />
</div>
<Button className="w-full mt-2" type="submit">Создать</Button>
</form>
</DialogContent>
</Dialog>
)
}
@@ -0,0 +1,6 @@
.footer {
position: absolute;
bottom: 10px;
text-align: center;
width: 100%;
}
+12
View File
@@ -0,0 +1,12 @@
import React from 'react'
import './Footer.css'
const Footer = () => {
return (
<footer className='footer'>
<h5 className='ibm-plex-sans-extralight'>Команда 4891</h5>
</footer>
)
}
export default Footer
@@ -0,0 +1,57 @@
.goods-list {
width: 360px;
max-height: 320px;
margin-left: auto;
margin-right: auto;
background-color: #fef7ff;
}
.goods-list-item {
height: 40px;
padding: 8px 28px 8px 16px;
color: #8d898f;
font-size: 16px;
display: flex;
justify-content: space-between;
}
.goods-list-item input[type="checkbox"] {
appearance: none;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border: #65558f solid 1px;
outline: none;
accent-color: #65558f;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-ms-border-radius: 2px;
-o-border-radius: 2px;
transition: 0.2s;
-webkit-transition: 0.2s;
-moz-transition: 0.2s;
-ms-transition: 0.2s;
-o-transition: 0.2s;
}
.goods-list-item input[type="checkbox"]:checked {
background: #65558f;
}
.goods-list-item input[type="checkbox"]:not(:checked) {
background: #fef7ff;
}
.goods-list-item input[type="checkbox"]:checked::before {
content: '\2713';
color: #fef7ff;
font-size: 16px;
font-weight: 600;
}
@@ -0,0 +1,45 @@
import React, { useState } from 'react'
import './GoodsList.css'
interface Props {
goods: string[];
change: (idx: number, newValue: string) => void
}
const GoodsList = ({goods, change}: Props) => {
const [unselected, setUnselected] = useState<boolean[]>([])
const [Goods, setGoods] = useState<string[]>([])
const handleChange = (idx: number) => {
const newUnselected = [...unselected]
newUnselected[idx] = !newUnselected[idx]
// fetch('unselect')
setUnselected(newUnselected)
}
const handleChangeName = (idx: number, newValue: string) => {
change(idx, newValue)
// let newGoods = Goods
// newGoods[idx] = newValue
// setGoods(newGoods)
}
return (
<div className='goods-list'>
{goods.map((good, idx) =>
<div key={idx} className='goods-list-item'>
<input
type="text"
className='ibm-plex-sans-regular'
placeholder="Название товара"
value={goods[idx] || ''}
onChange={(event: React.ChangeEvent<HTMLInputElement>) => handleChangeName(idx, event.target.value)}/>
<input type="checkbox" checked={!unselected[idx]} onChange={() => handleChange(idx)}/>
</div>
)}
</div>
)
}
export default GoodsList
@@ -0,0 +1,34 @@
.group-item {
background-color: #f7f2fa;
width: 360px;
height: 80px;
padding: 16px 0px 16px 16px;
display: flex;
align-items: center;
gap: 16px;
border-radius: 12px;
-webkit-border-radius: 12px;
-moz-border-radius: 12px;
-ms-border-radius: 12px;
-o-border-radius: 12px;
box-shadow: 1px 3px 10px 0px rgba(34, 60, 80, 0.15);
}
.group-item .body {
width: 192px;
height: 48px;
}
.group-item .arrow {
width: 80px;
height: 80px;
padding: 16px;
background: transparent;
border: none;
outline: none;
}
@@ -0,0 +1,48 @@
import React from "react";
import "./GroupItem.css";
import GroupLogo from "../GroupLogo/GroupLogo";
import { useNavigate } from "react-router-dom";
import { Event } from "@/shared/api/generated";
interface Props {
event: Event;
}
const GroupItem = ({ event }: Props) => {
const navigate = useNavigate();
return (
<div
className="group-item w-full"
onClick={() => {
if (event.id) {
navigate(`/events/${event.id}`);
}
else {
navigate(`/`);
}
}}
>
<GroupLogo name={event.name || ""} />
<div className="body">
<h4 className="ibm-plex-sans-medium">{event.name}</h4>
{/*<p className='ibm-plex-sans-light'>{event.membersCount} {event.membersCount % 10 < 4 ? 'участника' : 'участников'}</p>*/}
</div>
<button className="arrow">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="SVGRepo_bgCarrier" strokeWidth="0"></g>
<g id="SVGRepo_tracerCarrier" strokeLinejoin="round"></g>
<g id="SVGRepo_iconCarrier">
{" "}
<path
d="M7.82054 20.7313C8.21107 21.1218 8.84423 21.1218 9.23476 20.7313L15.8792 14.0868C17.0505 12.9155 17.0508 11.0167 15.88 9.84497L9.3097 3.26958C8.91918 2.87905 8.28601 2.87905 7.89549 3.26958C7.50497 3.6601 7.50497 4.29327 7.89549 4.68379L14.4675 11.2558C14.8581 11.6464 14.8581 12.2795 14.4675 12.67L7.82054 19.317C7.43002 19.7076 7.43002 20.3407 7.82054 20.7313Z"
stroke-fill="#0F0F0F"
></path>{" "}
</g>
</svg>
</button>
</div>
);
};
export default GroupItem;
@@ -0,0 +1,6 @@
.groups {
display: flex;
flex-direction: column;
gap: 20px;
margin-bottom: 56px;
}
@@ -0,0 +1,33 @@
import React, {useEffect} from 'react'
import GroupItem from '../GroupItem/GroupItem'
import './GroupList.css'
import {useQuery} from "@tanstack/react-query";
import {defaultReq, eventsApi} from "../../shared/api";
import {useLocation} from 'react-router-dom';
const GroupList = () => {
const location = useLocation()
const {data, refetch} = useQuery({
queryKey: ['events'],
queryFn: () => eventsApi.listEventsApiEventsGet(defaultReq),
initialData: []
})
useEffect(() => {
refetch()
}, [location])
console.log('data', data)
return (
<div className='groups'>
{data?.length ? (data?.map((group) => (
<GroupItem key={group.id} event={group} />
))) : ('Пока нет событий')
}
</div>
)
}
export default GroupList
@@ -0,0 +1,11 @@
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
color: #4f378a;
background-color: #eaddff;
display: flex;
align-items: center;
justify-content: center;
}
@@ -0,0 +1,14 @@
import React from 'react'
import './GroupLogo.css'
interface Props {
name: string
}
const GroupLogo = ({name}: Props) => {
return (
<div className="avatar"><span>{name.slice(0, 1).toUpperCase()}</span></div>
)
}
export default GroupLogo
@@ -0,0 +1,2 @@
.header {
}
+11
View File
@@ -0,0 +1,11 @@
import './Header.css'
const Header = () => {
return (
<header className='header'>
{/*<h1>Ваши ивенты</h1>*/}
</header>
)
}
export default Header
+58
View File
@@ -0,0 +1,58 @@
import {IDetectedBarcode, Scanner} from "@yudiel/react-qr-scanner";
import {FC, useState} from "react";
import {ModalProps} from "./CreateTransactionModal";
import {defaultReq, utilsApi} from "../shared/api";
import {Transaction} from "../shared/api/generated";
import {Button} from "../shared/ui/button";
export const ScannerModal: FC<ModalProps & {
onHandle: (trx: Transaction) => void,
eventId: string,
}> = ({onHandle, isOpen,onClose, eventId}) => {
const [tab, setTab] = useState(0)
const [transaction, setTransaction] = useState<Transaction | null>(null)
const onSubmit = async (barcode: IDetectedBarcode) => {
const raw = barcode.rawValue;
const ofd = await utilsApi.ofdApiUtilsOfdPost({
ofdRequest: {eventId, ofdString: raw},
}, defaultReq)
setTransaction(transaction)
onHandle(ofd)
setTab(1)
}
const close = () => {
setTab(0)
onClose()
}
if (!isOpen) return
return (
<div className="fixed inset-0 flex items-center justify-center z-50">
<div className="fixed inset-0 bg-black opacity-50" onClick={close}></div>
<div className="bg-white rounded-lg overflow-hidden shadow-lg z-10 w-full h-80">
<div className="p-4">
{tab == 0 && (
<div className='min-h-[500px]'>
<Scanner onScan={(d) => onSubmit(d[0])} />
</div>
)}
{tab == 1 && (
<div className='flex flex-col gap-2'>
<span className='text-xl font-bold'>Продукты из чека заимпортированы</span>
<Button className='w-full' onClick={close}>Окей, спасибо</Button>
</div>
)}
</div>
</div>
</div>
)
}
@@ -0,0 +1,95 @@
import { FC, useState } from "react";
import { Dialog, DialogContent, DialogHeader } from "../../shared/ui/dialog";
import { Input } from "../../shared/ui/input";
import React from "react";
import { User } from "../../shared/api/generated";
import { transactionsApi } from "../../shared/api";
import { queryClient } from "../../app";
import { Button } from "../../shared/ui/button";
export interface ModalProps {
isOpen: boolean;
users: User[];
eventId: string;
transactionId: string;
onClose: () => void;
}
export const CreateItemModal: FC<ModalProps> = ({ isOpen, onClose, users, transactionId, eventId }) => {
const [title, setTitle] = useState('')
const [price, setPrice] = useState(0)
const [user, setUser] = useState('')
const handleChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
setUser(event.target.value)
}
const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault()
try {
await transactionsApi.addItemToTransactionApiTransactionEventIdTransactionIdItemsPost({
eventId,
transactionId,
bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost:
{
title,
price,
addAllUsers: true,
}
})
} catch (error) {
console.error(error)
} finally {
queryClient.invalidateQueries({queryKey: ["transaction", eventId]})
onClose()
}
}
return (
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent>
<DialogHeader>Добавить новый товар</DialogHeader>
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="title">Название</label>
<Input id='title' value={title} onChange={e => setTitle(e.target.value)} />
</div>
<div>
<label htmlFor="price">Стоимость</label>
<Input
id='price'
value={price}
onChange={(e) => {
const num = Number(e.target.value);
if (!isNaN(num)) {
setPrice(num)
}
}}
/>
</div>
<div>
<label htmlFor="user">Пользователь: </label>
<select
className="select-user"
id="user"
name="user"
value={user}
onChange={handleChange}
>
{users.map((user) => (
<option key={user.id} value={user.id}>
{user.username}
</option>
))}
</select>
</div>
<Button className="w-full mt-2" type="submit">Создать</Button>
</form>
</DialogContent>
</Dialog>
)
}
@@ -0,0 +1,28 @@
.transaction {
position: relative;
}
.transaction h3 {
font-size: 20px;
margin-bottom: 12px;
}
.transaction-items {
background-color: #fef7ff;
}
.transaction-item p {
margin: 0px 64px 0px auto;
}
.transaction-item button {
position: absolute;
right: 16px;
}
.transaction-item-add {
position: absolute;
top: 5px;
right: 9px;
}
@@ -0,0 +1,65 @@
import { Trash2 } from 'lucide-react';
import React, { useState } from 'react'
import './Transaction.css'
import { User } from '../../shared/api/generated';
import { CreateItemModal } from './Modal';
type transaction = {
id: string;
title: string
items: {
id: string
title: string
price: number
assigned_to: string
username: string
}[]
}
interface Props {
transaction: transaction
deleteItem: (itemId: string) => void
eventId: string
users: User[]
}
const Transaction = ({transaction, deleteItem, users, eventId}: Props) => {
const [openedModal, setOpenedModal] = useState(false)
console.log(transaction)
return (
<div className='transaction'>
<h3 className='ibm-plex-sans-semibold'>Транзакция {transaction.title}</h3>
<div className="transaction-items flex flex-col rounded-md">
{transaction.items.length > 0 ?
transaction.items.map((item) => (
<div className='p-2 flex justify-between' key={item.id}>
<h5>{item.title}</h5>
<p>{item.price}</p>
<div className="users">
{item.assigned_to?.map(user =>
<span>{user.username}</span>
)}
</div>
{/* <button onClick={() => deleteItem(item.id)}>
<Trash2 />
</button> */}
</div>
))
: <div className='transaction-item'>Здесь пока нету товаров</div>}
</div>
<div className='transaction-item-add plus' onClick={() => setOpenedModal(true)}>
<svg className="plus-icon" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" xmlBase="http://www.bohemiancoding.com/sketch/ns" fill="#65558f"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <title>plus-circle</title> <desc>Created with Sketch Beta.</desc> <defs> </defs> <g id="Page-1" stroke-width="0.00032" fill="none" fill-rule="evenodd" type="MSPage"> <g id="Icon-Set" type="MSLayerGroup" transform="translate(-464.000000, -1087.000000)" fill="#65558f"> <path d="M480,1117 C472.268,1117 466,1110.73 466,1103 C466,1095.27 472.268,1089 480,1089 C487.732,1089 494,1095.27 494,1103 C494,1110.73 487.732,1117 480,1117 L480,1117 Z M480,1087 C471.163,1087 464,1094.16 464,1103 C464,1111.84 471.163,1119 480,1119 C488.837,1119 496,1111.84 496,1103 C496,1094.16 488.837,1087 480,1087 L480,1087 Z M486,1102 L481,1102 L481,1097 C481,1096.45 480.553,1096 480,1096 C479.447,1096 479,1096.45 479,1097 L479,1102 L474,1102 C473.447,1102 473,1102.45 473,1103 C473,1103.55 473.447,1104 474,1104 L479,1104 L479,1109 C479,1109.55 479.447,1110 480,1110 C480.553,1110 481,1109.55 481,1109 L481,1104 L486,1104 C486.553,1104 487,1103.55 487,1103 C487,1102.45 486.553,1102 486,1102 L486,1102 Z" id="plus-circle" type="MSShapeGroup"> </path> </g> </g> </g></svg>
</div>
<CreateItemModal
isOpen={openedModal}
onClose={() => setOpenedModal(false)}
users={users}
transactionId={transaction.id}
eventId={eventId}/>
</div>
)
}
export default Transaction
@@ -0,0 +1,54 @@
.transactions-list {
display: flex;
flex-direction: column;
gap: 36px;
overflow-y: scroll;
margin: 0px 23px;
}
.transactions-list-filters {
position: absolute;
bottom: 95px;
left: 95px;
width: 253px;
height: 48px;
display: flex;
border: #79747e 1px solid;
border-radius: 20px;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
-ms-border-radius: 20px;
-o-border-radius: 20px;
}
.transactions-list-filters button {
color: #1d1b20;
transition: 0.6s;
-webkit-transition: 0.6s;
-moz-transition: 0.6s;
-ms-transition: 0.6s;
-o-transition: 0.6s;
}
.transactions-list-filters button:first-child {
border-radius: 20px 0px 0px 20px;
-webkit-border-radius: 20px 0px 0px 20px;
-moz-border-radius: 20px 0px 0px 20px;
-ms-border-radius: 20px 0px 0px 20px;
-o-border-radius: 20px 0px 0px 20px;
padding: 10px 17.25px;
}
.transactions-list-filters button:last-child {
border-radius: 0px 20px 20px 0px;
-webkit-border-radius: 0px 20px 20px 0px;
-moz-border-radius: 0px 20px 20px 0px;
-ms-border-radius: 0px 20px 20px 0px;
-o-border-radius: 0px 20px 20px 0px;
padding: 10px 6.75px;
}
.transactions-list-filters button.active {
background-color: #e8def8;
color: #4a4459;
}
@@ -0,0 +1,49 @@
import React, { useEffect } from 'react'
import Transaction from '../Transaction/Transaction'
import { defaultReq, eventsApi, transactionsApi } from '../../shared/api'
import './TransactionsList.css'
import { useQuery } from '@tanstack/react-query'
import { OutputTransaction, User } from '../../shared/api/generated'
interface Props {
eventId: string
users: User[]
}
const TransactionsList = ({ eventId, users }: Props) => {
const [transactions, setTransactions] = React.useState<any[]>([])
const { data, refetch } = useQuery({
queryKey: ['transaction', eventId],
queryFn: () => transactionsApi.listTransactionsApiTransactionEventIdGet({ eventId }, defaultReq),
})
useEffect(() => {
setTransactions(data || [])
}, [data])
const deleteItem = (itemId: string) => {
// await DELETE_ITEM(itemId)
const newTransactions = transactions.map(transaction => ({
...transaction, items: transaction.items.filter(item => item.id !== itemId)
}))
setTransactions(newTransactions)
}
return (
<>
<div className='transactions-list overflow-y-auto'>
{transactions.map(transaction =>
<Transaction
key={transaction.id}
deleteItem={deleteItem}
transaction={transaction!}
eventId={eventId}
users={users || []} />
)}
</div>
</>
)
}
export default TransactionsList
+28
View File
@@ -0,0 +1,28 @@
import {c} from "@/shared/api"
import {TelegramInputData} from "@/shared/api/generated"
export const getToken = async (telegramData: TelegramInputData) => {
if (telegramData === null || telegramData === undefined) return 'No data'
let data: any = null
try {
const res = await fetch(c.basePath + '/api/auth/token', {
body: JSON.stringify(telegramData),
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
})
const data = await res.json()
} catch (error) {
return 'no data'
}
if (data === null) return 'No data'
localStorage.setItem('token', data.access_token)
return data.access_token
}
+1
View File
@@ -0,0 +1 @@
export * as AuthToken from './getToken.ts'
+97
View File
@@ -0,0 +1,97 @@
@import url('https://fonts.googleapis.com/css2?family=Brawler:wght@400;700&family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "IBM Plex Sans", sans-serif;
}
.ibm-plex-sans-thin {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 100;
font-style: normal;
}
.ibm-plex-sans-extralight {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 200;
font-style: normal;
}
.ibm-plex-sans-light {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 300;
font-style: normal;
}
.ibm-plex-sans-regular {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 400;
font-style: normal;
}
.ibm-plex-sans-medium {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 500;
font-style: normal;
}
.ibm-plex-sans-semibold {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 600;
font-style: normal;
}
.ibm-plex-sans-bold {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 700;
font-style: normal;
}
.ibm-plex-sans-thin-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 100;
font-style: italic;
}
.ibm-plex-sans-extralight-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 200;
font-style: italic;
}
.ibm-plex-sans-light-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 300;
font-style: italic;
}
.ibm-plex-sans-regular-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 400;
font-style: italic;
}
.ibm-plex-sans-medium-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 500;
font-style: italic;
}
.ibm-plex-sans-semibold-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 600;
font-style: italic;
}
.ibm-plex-sans-bold-italic {
font-family: "IBM Plex Sans", sans-serif;
font-weight: 700;
font-style: italic;
}
#root {
width: 100vw;
height: 100vh;
}
+24
View File
@@ -0,0 +1,24 @@
import { FC } from "react";
import { RouterProvider } from "react-router-dom";
import { router } from "./router";
import "./main.css";
import "./index.css";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import {WebAppProvider} from "@vkruglikov/react-telegram-web-app";
export const queryClient = new QueryClient();
export const App: FC = () => {
return (
<WebAppProvider
options={{
smoothButtonsTransition: true,
}}
>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
</QueryClientProvider>
</WebAppProvider>
);
};
+74
View File
@@ -0,0 +1,74 @@
@import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap");
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
font-family: "IBM Plex Sans", sans-serif;
}
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 0 0% 3.9%;
--card: 0 0% 100%;
--card-foreground: 0 0% 3.9%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 3.9%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 98%;
--secondary: 0 0% 96.1%;
--secondary-foreground: 0 0% 9%;
--muted: 0 0% 96.1%;
--muted-foreground: 0 0% 45.1%;
--accent: 0 0% 96.1%;
--accent-foreground: 0 0% 9%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 89.8%;
--input: 0 0% 89.8%;
--ring: 0 0% 3.9%;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
--radius: 0.5rem;
}
.dark {
--background: 0 0% 3.9%;
--foreground: 0 0% 98%;
--card: 0 0% 3.9%;
--card-foreground: 0 0% 98%;
--popover: 0 0% 3.9%;
--popover-foreground: 0 0% 98%;
--primary: 0 0% 98%;
--primary-foreground: 0 0% 9%;
--secondary: 0 0% 14.9%;
--secondary-foreground: 0 0% 98%;
--muted: 0 0% 14.9%;
--muted-foreground: 0 0% 63.9%;
--accent: 0 0% 14.9%;
--accent-foreground: 0 0% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 14.9%;
--input: 0 0% 14.9%;
--ring: 0 0% 83.1%;
--chart-1: 220 70% 50%;
--chart-2: 160 60% 45%;
--chart-3: 30 80% 55%;
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%;
}
}
@layer base {
* {
@apply border-border;
}
body {
@apply bg-background text-foreground;
}
}
+37
View File
@@ -0,0 +1,37 @@
import {createBrowserRouter} from "react-router-dom";
import {HomePage} from "../pages/HomePage";
import Layout from "../layouts/layout";
import EditGroupPage from "../pages/EditGroupPage";
import CreateGroupPage from "../pages/CreateGroupPage";
import {EventPage} from "../pages/EventPage";
import {Wrapper} from "../layouts/wrapper";
export const router = createBrowserRouter([
{
element: <Wrapper />,
children: [
{
path: '/',
element: <Layout />,
children: [
{
index: true,
element: <HomePage />
}
],
},
{
path: "/events/:id",
element: <EventPage />,
},
{
path: '/edit-group',
element: <EditGroupPage />
},
{
path: '/create-group',
element: <CreateGroupPage />
}
]
}
])
+17
View File
@@ -0,0 +1,17 @@
import React from 'react'
import { Outlet } from 'react-router-dom'
import Header from '../Components/Header/Header'
import Footer from '../Components/Footer/Footer'
function Layout() {
return (
<>
<Header />
<main>
<Outlet />
</main>
</>
)
}
export default Layout
+40
View File
@@ -0,0 +1,40 @@
import {Outlet, useParams, useSearchParams} from "react-router-dom";
import {useEffect} from "react";
import {useInitData} from "@vkruglikov/react-telegram-web-app";
import {defaultReq, eventsApi} from "../shared/api";
import {queryClient} from "../app";
export const Wrapper = () => {
const [initUnsafe, init] = useInitData();
const [url, setUrl] = useSearchParams()
useEffect(() => {
console.log(url)
setTimeout(async () => {
if (url.has('tgWebAppStartParam')) {
await eventsApi.addToEventApiEventsAddEventIdPost({eventId: url.get('tgWebAppStartParam')}, defaultReq)
await queryClient.invalidateQueries({
queryKey: ["events"]
})
} else {}
}, 500)
}, [url]);
useEffect(() => {
(async () => {
console.log('авторизация', init, initUnsafe)
if(initUnsafe || init) {
if (initUnsafe?.user?.id) {
localStorage.setItem('userId', initUnsafe?.user?.id.toString())
}
// console.log(await AuthToken.getToken(initUnsafe as any))
}
})()
}, [initUnsafe, init]);
return <Outlet />
}
+4
View File
@@ -0,0 +1,4 @@
import { createRoot } from "react-dom/client";
import { App } from "./app";
createRoot(document.getElementById("root")!).render(<App />);
+22
View File
@@ -0,0 +1,22 @@
import '../styles/CreateGroup.css'
import CreateGroup from '../Components/CreateGroup/CreateGroup';
import { useNavigate } from 'react-router-dom';
import { LucideArrowLeft } from 'lucide-react';
import React from 'react';
const CreateGroupPage = () => {
const navigate = useNavigate()
return (
<div className='p-4'>
<header className='create-header'>
<h1 className='text-2xl'>Создание события</h1>
</header>
<main className=''>
<CreateGroup />
</main>
</div>
)
}
export default CreateGroupPage
+43
View File
@@ -0,0 +1,43 @@
import React, { useEffect } from 'react'
import '../styles/CreateGroup.css'
import GoodsList from '../Components/GoodsList/GoodsList'
import AddCheckButton from '../Components/AddCheckButton/AddCheckButton'
import AddGoodsButton from '../Components/AddGoodsButton/AddGoodsButton'
const EditGroupPage = () => {
const [goods, setGoods] = React.useState<string[]>([])
useEffect(() => {
setGoods([
'Товар 1',
'Товар 2',
'Товар 3',
'Товар 4',
])
}, [])
const adder = () => {
setGoods([...goods, 'Новый товар'])
}
const changer = (idx: number, newValue: string) => {
let newGoods = goods
newGoods[idx] = newValue
setGoods(newGoods)
console.log(goods, 'c')
}
return (
<main className='create-group-wrapper'>
<form>
<input type='text' placeholder='Название группы' />
</form>
<div className="line"></div>
<GoodsList goods={goods} change={changer}/>
<AddCheckButton />
<AddGoodsButton OnClick={adder} />
</main>
)
}
export default EditGroupPage
+154
View File
@@ -0,0 +1,154 @@
import { useNavigate, useParams } from "react-router-dom";
import { useQuery } from "@tanstack/react-query";
import { useEffect, useState } from "react";
import { Scanner } from "@yudiel/react-qr-scanner";
import { calculateDebitsApi, defaultReq, eventsApi } from "../shared/api";
import { CreateTransactionModal } from "../Components/CreateTransactionModal";
import { BackButton } from "@vkruglikov/react-telegram-web-app";
import { LucideArrowLeft, Share } from "lucide-react";
import TransactionsList from "../Components/TransactionsList/TransactionsList";
import { Dialog, DialogContent } from "../shared/ui/dialog";
import QRCode from "qrcode";
import { Input } from "../shared/ui/input";
import { Button } from "../shared/ui/button";
import "../styles/EventPage.css";
import React from "react";
import { ScannerModal } from "../Components/ScannerModal";
import { initUtils } from "@tma.js/sdk";
import { queryClient } from "../app";
export const EventPage = () => {
const { id } = useParams();
const utils = initUtils();
const [isScanOpen, setIsScanOpen] = useState(false);
const [isOpenModal, setIsOpenModal] = useState(false);
const [share, setShare] = useState(false);
const [showDebt, setShowDebt] = useState(false);
const navigate = useNavigate();
const { data, refetch } = useQuery({
queryKey: ["event", id],
queryFn: () =>
eventsApi.eventByIdApiEventsEventIdGet({
eventId: id!,
}),
enabled: id !== undefined && id !== null,
});
useEffect(() => {
(async () => {
// if (isNaN(Number(id))) navigate('/', {replace: true})
})();
}, []);
const calculateDebt = async () => {
await calculateDebitsApi
.calculateEventDebtsApiCalculateDebitsEventsEventIdPost(
{
eventId: id!,
},
defaultReq
)
.catch();
setShowDebt(true);
};
return (
<div>
<div className="px-2 py-4 mb-2 flex justify-between items-center">
<h1 className="text-4xl font-bold">{data?.name}</h1>
<button className="p-2 rounded-2xl bg-red-100" onClick={calculateDebt}>
Посчитать долги
</button>
</div>
<div className="w-full border ml-auto mr-auto border-#e3e3e3"></div>
<div className="p-2 overflow-y-auto max-h-[80dvh] grid gap-2">
<TransactionsList users={data?.users || []} eventId={id!} />
</div>
<div className="absolute bottom-2 left-5 right-5">
<div className="flex justify-center gap-2 items-center">
<button
className="bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl"
onClick={() => navigate("/")}
>
<LucideArrowLeft />
</button>
<button
className="bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl"
onClick={() => setIsOpenModal(true)}
>
Добавить транзакцию
</button>
<button
className="bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl"
onClick={() => setIsScanOpen(!isScanOpen)}
>
Сканировать чек
</button>
<button
className="bg-[#ece6f0] active:bg-pink-200 p-4 rounded-2xl"
onClick={async () => {
setShare(!share);
setTimeout(() => {
QRCode.toCanvas(
document.querySelector("#goida"),
data?.invite || ""
);
}, 300);
}}
>
<Share />
</button>
</div>
</div>
<ScannerModal isOpen={isScanOpen} onClose={() => setIsScanOpen(false)} onHandle={() => {
queryClient.invalidateQueries({queryKey: ["transaction", id]})
}} eventId={id!} />
<CreateTransactionModal
isOpen={isOpenModal}
onClose={() => setIsOpenModal(false)}
eventId={id!} />
<BackButton onClick={() => navigate("/")}></BackButton>
<Dialog open={showDebt} onOpenChange={() => setShowDebt(!showDebt)}>
<DialogContent>
<span className="text-xl">
Долги посчитаны, коллекторы отправлены
</span>
</DialogContent>
</Dialog>
<Dialog open={share} onOpenChange={() => setShare(!share)}>
<DialogContent>
<canvas id="goida" className="min-w-64 min-h-64 mx-auto" />
<div className="flex items-center gap-1">
<Input disabled value={'https://t.me/{{sensitive_data}}/?startapp=' + data?.id || ''} />
<Button
onClick={() => {
navigator.clipboard.writeText('https://t.me/{{sensitive_data}}/?startapp=' + data?.id || '');
}}
>
Копировать
</Button>
<Button
onClick={() => {
utils.openTelegramLink(
`https://t.me/share/url?url=https://t.me/{{sensitive_data}}/?startapp=${data?.id}&text=Саня верни сотку!`
);
}}
>
Поделиться
</Button>
</div>
</DialogContent>
</Dialog>
</div>
);
};
+14
View File
@@ -0,0 +1,14 @@
import '../styles/Home.css'
import GroupList from "../Components/GroupList/GroupList";
import AddButton from "../Components/AddButton/AddButton";
export const HomePage = () => {
return (
<div className="wrapper p-4">
<h1 className='text-lg mb-2 ibm-plex-sans-bold'>Ваши события</h1>
<GroupList />
<AddButton text="Создать" navigateTo="/create-group" />
</div>
)
}
@@ -0,0 +1,23 @@
# OpenAPI Generator Ignore
# Generated by openapi-generator https://github.com/openapitools/openapi-generator
# Use this file to prevent files from being overwritten by the generator.
# The patterns follow closely to .gitignore or .dockerignore.
# As an example, the C# client generator defines ApiClient.cs.
# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
#ApiClient.cs
# You can match any string of characters against a directory, file or extension with a single asterisk (*):
#foo/*/qux
# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
#foo/**/qux
# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
# You can also negate patterns with an exclamation (!).
# For example, you can ignore all files in a docs folder with the file extension .md:
#docs/*.md
# Then explicitly reverse the ignore rule for a single file:
#!docs/README.md
@@ -0,0 +1,29 @@
apis/AuthApi.ts
apis/CalculateDebitsApi.ts
apis/EventsApi.ts
apis/ItemsApi.ts
apis/TransactionsApi.ts
apis/UtilsApi.ts
apis/index.ts
index.ts
models/BaseEvent.ts
models/BasicResponse.ts
models/BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost.ts
models/Debt.ts
models/Event.ts
models/HTTPValidationError.ts
models/Item.ts
models/ItemRequest.ts
models/OfdRequest.ts
models/OutputEvent.ts
models/OutputItem.ts
models/OutputTransaction.ts
models/TelegramInputData.ts
models/TelegramWebUser.ts
models/Token.ts
models/Transaction.ts
models/User.ts
models/ValidationError.ts
models/ValidationErrorLocInner.ts
models/index.ts
runtime.ts
@@ -0,0 +1 @@
7.9.0
@@ -0,0 +1,109 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
HTTPValidationError,
TelegramInputData,
Token,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
TelegramInputDataFromJSON,
TelegramInputDataToJSON,
TokenFromJSON,
TokenToJSON,
} from '../models/index';
export interface AuthenticateApiAuthTokenPostRequest {
telegramInputData: TelegramInputData;
}
/**
*
*/
export class AuthApi extends runtime.BaseAPI {
/**
* Authenticate
*/
async authenticateApiAuthTokenPostRaw(requestParameters: AuthenticateApiAuthTokenPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Token>> {
if (requestParameters['telegramInputData'] == null) {
throw new runtime.RequiredError(
'telegramInputData',
'Required parameter "telegramInputData" was null or undefined when calling authenticateApiAuthTokenPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
const response = await this.request({
path: `/api/auth/token`,
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: TelegramInputDataToJSON(requestParameters['telegramInputData']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => TokenFromJSON(jsonValue));
}
/**
* Authenticate
*/
async authenticateApiAuthTokenPost(requestParameters: AuthenticateApiAuthTokenPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Token> {
const response = await this.authenticateApiAuthTokenPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Ping
*/
async pingApiAuthPingGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<string>> {
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
const response = await this.request({
path: `/api/auth/ping`,
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
if (this.isJsonMime(response.headers.get('content-type'))) {
return new runtime.JSONApiResponse<string>(response);
} else {
return new runtime.TextApiResponse(response) as any;
}
}
/**
* Ping
*/
async pingApiAuthPingGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<string> {
const response = await this.pingApiAuthPingGetRaw(initOverrides);
return await response.value();
}
}
@@ -0,0 +1,80 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
Debt,
HTTPValidationError,
} from '../models/index';
import {
DebtFromJSON,
DebtToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
} from '../models/index';
export interface CalculateEventDebtsApiCalculateDebitsEventsEventIdPostRequest {
eventId: string;
}
/**
*
*/
export class CalculateDebitsApi extends runtime.BaseAPI {
/**
* Get debts smeta
* Calculate Event Debts
*/
async calculateEventDebtsApiCalculateDebitsEventsEventIdPostRaw(requestParameters: CalculateEventDebtsApiCalculateDebitsEventsEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<Debt>>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling calculateEventDebtsApiCalculateDebitsEventsEventIdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/calculate_debits/events/{event_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(DebtFromJSON));
}
/**
* Get debts smeta
* Calculate Event Debts
*/
async calculateEventDebtsApiCalculateDebitsEventsEventIdPost(requestParameters: CalculateEventDebtsApiCalculateDebitsEventsEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<Debt>> {
const response = await this.calculateEventDebtsApiCalculateDebitsEventsEventIdPostRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,222 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BaseEvent,
BasicResponse,
Event,
HTTPValidationError,
OutputEvent,
} from '../models/index';
import {
BaseEventFromJSON,
BaseEventToJSON,
BasicResponseFromJSON,
BasicResponseToJSON,
EventFromJSON,
EventToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
OutputEventFromJSON,
OutputEventToJSON,
} from '../models/index';
export interface AddToEventApiEventsAddEventIdPostRequest {
eventId: string;
}
export interface CreateEventApiEventsPostRequest {
baseEvent: BaseEvent;
}
export interface EventByIdApiEventsEventIdGetRequest {
eventId: string;
}
/**
*
*/
export class EventsApi extends runtime.BaseAPI {
/**
* Add user to event
* Add To Event
*/
async addToEventApiEventsAddEventIdPostRaw(requestParameters: AddToEventApiEventsAddEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputEvent>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling addToEventApiEventsAddEventIdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/events/add/{event_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputEventFromJSON(jsonValue));
}
/**
* Add user to event
* Add To Event
*/
async addToEventApiEventsAddEventIdPost(requestParameters: AddToEventApiEventsAddEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputEvent> {
const response = await this.addToEventApiEventsAddEventIdPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Create event
* Create Event
*/
async createEventApiEventsPostRaw(requestParameters: CreateEventApiEventsPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Event>> {
if (requestParameters['baseEvent'] == null) {
throw new runtime.RequiredError(
'baseEvent',
'Required parameter "baseEvent" was null or undefined when calling createEventApiEventsPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/events/`,
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: BaseEventToJSON(requestParameters['baseEvent']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => EventFromJSON(jsonValue));
}
/**
* Create event
* Create Event
*/
async createEventApiEventsPost(requestParameters: CreateEventApiEventsPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Event> {
const response = await this.createEventApiEventsPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get info for an event by the id
* Event By Id
*/
async eventByIdApiEventsEventIdGetRaw(requestParameters: EventByIdApiEventsEventIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputEvent>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling eventByIdApiEventsEventIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/events/{event_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputEventFromJSON(jsonValue));
}
/**
* Get info for an event by the id
* Event By Id
*/
async eventByIdApiEventsEventIdGet(requestParameters: EventByIdApiEventsEventIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputEvent> {
const response = await this.eventByIdApiEventsEventIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Return events containing given user (by token)
* List Events
*/
async listEventsApiEventsGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OutputEvent>>> {
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/events/`,
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OutputEventFromJSON));
}
/**
* Return events containing given user (by token)
* List Events
*/
async listEventsApiEventsGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OutputEvent>> {
const response = await this.listEventsApiEventsGetRaw(initOverrides);
return await response.value();
}
}
@@ -0,0 +1,81 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
Event,
HTTPValidationError,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
EventFromJSON,
EventToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
} from '../models/index';
export interface JoinByInviteApiInvitesInviteIdGetRequest {
inviteId: string;
}
/**
*
*/
export class InvitesApi extends runtime.BaseAPI {
/**
* Join By Invite
*/
async joinByInviteApiInvitesInviteIdGetRaw(requestParameters: JoinByInviteApiInvitesInviteIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Event>> {
if (requestParameters['inviteId'] == null) {
throw new runtime.RequiredError(
'inviteId',
'Required parameter "inviteId" was null or undefined when calling joinByInviteApiInvitesInviteIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/invites/{invite_id}`.replace(`{${"invite_id"}}`, encodeURIComponent(String(requestParameters['inviteId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => EventFromJSON(jsonValue));
}
/**
* Join By Invite
*/
async joinByInviteApiInvitesInviteIdGet(requestParameters: JoinByInviteApiInvitesInviteIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Event> {
const response = await this.joinByInviteApiInvitesInviteIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,199 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
HTTPValidationError,
ItemRequest,
OutputItem,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
ItemRequestFromJSON,
ItemRequestToJSON,
OutputItemFromJSON,
OutputItemToJSON,
} from '../models/index';
export interface CreateItemApiItemsTransactionIdPostRequest {
transactionId: string;
itemRequest: ItemRequest;
}
export interface GetItemApiItemsTransactionIdItemIdGetRequest {
transactionId: string;
itemId: string;
}
export interface GetItemsApiItemsTransactionIdGetRequest {
transactionId: string;
}
/**
*
*/
export class ItemsApi extends runtime.BaseAPI {
/**
* Create item in transaction
* Create Item
*/
async createItemApiItemsTransactionIdPostRaw(requestParameters: CreateItemApiItemsTransactionIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputItem>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling createItemApiItemsTransactionIdPost().'
);
}
if (requestParameters['itemRequest'] == null) {
throw new runtime.RequiredError(
'itemRequest',
'Required parameter "itemRequest" was null or undefined when calling createItemApiItemsTransactionIdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: ItemRequestToJSON(requestParameters['itemRequest']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputItemFromJSON(jsonValue));
}
/**
* Create item in transaction
* Create Item
*/
async createItemApiItemsTransactionIdPost(requestParameters: CreateItemApiItemsTransactionIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputItem> {
const response = await this.createItemApiItemsTransactionIdPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get item by itself ID
* Get Item
*/
async getItemApiItemsTransactionIdItemIdGetRaw(requestParameters: GetItemApiItemsTransactionIdItemIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputItem>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling getItemApiItemsTransactionIdItemIdGet().'
);
}
if (requestParameters['itemId'] == null) {
throw new runtime.RequiredError(
'itemId',
'Required parameter "itemId" was null or undefined when calling getItemApiItemsTransactionIdItemIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}/{item_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))).replace(`{${"item_id"}}`, encodeURIComponent(String(requestParameters['itemId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputItemFromJSON(jsonValue));
}
/**
* Get item by itself ID
* Get Item
*/
async getItemApiItemsTransactionIdItemIdGet(requestParameters: GetItemApiItemsTransactionIdItemIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputItem> {
const response = await this.getItemApiItemsTransactionIdItemIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get items from transaction
* Get Items
*/
async getItemsApiItemsTransactionIdGetRaw(requestParameters: GetItemsApiItemsTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OutputItem>>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling getItemsApiItemsTransactionIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OutputItemFromJSON));
}
/**
* Get items from transaction
* Get Items
*/
async getItemsApiItemsTransactionIdGet(requestParameters: GetItemsApiItemsTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OutputItem>> {
const response = await this.getItemsApiItemsTransactionIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,202 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
HTTPValidationError,
Item,
ItemRequest,
OutputItem,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
ItemFromJSON,
ItemToJSON,
ItemRequestFromJSON,
ItemRequestToJSON,
OutputItemFromJSON,
OutputItemToJSON,
} from '../models/index';
export interface CreateItemApiItemsTransactionIdPostRequest {
transactionId: string;
itemRequest: ItemRequest;
}
export interface GetItemApiItemsTransactionIdItemIdGetRequest {
transactionId: string;
itemId: string;
}
export interface GetItemsApiItemsTransactionIdGetRequest {
transactionId: string;
}
/**
*
*/
export class TagsApi extends runtime.BaseAPI {
/**
* Create item in transaction
* Create Item
*/
async createItemApiItemsTransactionIdPostRaw(requestParameters: CreateItemApiItemsTransactionIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Item>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling createItemApiItemsTransactionIdPost().'
);
}
if (requestParameters['itemRequest'] == null) {
throw new runtime.RequiredError(
'itemRequest',
'Required parameter "itemRequest" was null or undefined when calling createItemApiItemsTransactionIdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: ItemRequestToJSON(requestParameters['itemRequest']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => ItemFromJSON(jsonValue));
}
/**
* Create item in transaction
* Create Item
*/
async createItemApiItemsTransactionIdPost(requestParameters: CreateItemApiItemsTransactionIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Item> {
const response = await this.createItemApiItemsTransactionIdPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get item by itself ID
* Get Item
*/
async getItemApiItemsTransactionIdItemIdGetRaw(requestParameters: GetItemApiItemsTransactionIdItemIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputItem>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling getItemApiItemsTransactionIdItemIdGet().'
);
}
if (requestParameters['itemId'] == null) {
throw new runtime.RequiredError(
'itemId',
'Required parameter "itemId" was null or undefined when calling getItemApiItemsTransactionIdItemIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}/{item_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))).replace(`{${"item_id"}}`, encodeURIComponent(String(requestParameters['itemId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputItemFromJSON(jsonValue));
}
/**
* Get item by itself ID
* Get Item
*/
async getItemApiItemsTransactionIdItemIdGet(requestParameters: GetItemApiItemsTransactionIdItemIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputItem> {
const response = await this.getItemApiItemsTransactionIdItemIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get items from transaction
* Get Items
*/
async getItemsApiItemsTransactionIdGetRaw(requestParameters: GetItemsApiItemsTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<Item>>> {
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling getItemsApiItemsTransactionIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/items/{transaction_id}`.replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(ItemFromJSON));
}
/**
* Get items from transaction
* Get Items
*/
async getItemsApiItemsTransactionIdGet(requestParameters: GetItemsApiItemsTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<Item>> {
const response = await this.getItemsApiItemsTransactionIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,268 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost,
HTTPValidationError,
Item,
OutputTransaction,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostFromJSON,
BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
ItemFromJSON,
ItemToJSON,
OutputTransactionFromJSON,
OutputTransactionToJSON,
} from '../models/index';
export interface AddItemToTransactionApiTransactionEventIdTransactionIdItemsPostRequest {
eventId: string;
transactionId: string;
bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost: BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost;
}
export interface CreateTransactionApiTransactionEventIdPostRequest {
eventId: string;
body: string;
}
export interface GetTransactionApiTransactionEventIdTransactionIdGetRequest {
eventId: string;
transactionId: string;
}
export interface ListTransactionsApiTransactionEventIdGetRequest {
eventId: string;
}
/**
*
*/
export class TransactionsApi extends runtime.BaseAPI {
/**
* Create a transaction by a event id
* Add Item To Transaction
*/
async addItemToTransactionApiTransactionEventIdTransactionIdItemsPostRaw(requestParameters: AddItemToTransactionApiTransactionEventIdTransactionIdItemsPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Item>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling addItemToTransactionApiTransactionEventIdTransactionIdItemsPost().'
);
}
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling addItemToTransactionApiTransactionEventIdTransactionIdItemsPost().'
);
}
if (requestParameters['bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost'] == null) {
throw new runtime.RequiredError(
'bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost',
'Required parameter "bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost" was null or undefined when calling addItemToTransactionApiTransactionEventIdTransactionIdItemsPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/transaction/{event_id}/{transaction_id}/items`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))).replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostToJSON(requestParameters['bodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => ItemFromJSON(jsonValue));
}
/**
* Create a transaction by a event id
* Add Item To Transaction
*/
async addItemToTransactionApiTransactionEventIdTransactionIdItemsPost(requestParameters: AddItemToTransactionApiTransactionEventIdTransactionIdItemsPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Item> {
const response = await this.addItemToTransactionApiTransactionEventIdTransactionIdItemsPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Create a transaction by a event id
* Create Transaction
*/
async createTransactionApiTransactionEventIdPostRaw(requestParameters: CreateTransactionApiTransactionEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputTransaction>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling createTransactionApiTransactionEventIdPost().'
);
}
if (requestParameters['body'] == null) {
throw new runtime.RequiredError(
'body',
'Required parameter "body" was null or undefined when calling createTransactionApiTransactionEventIdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/transaction/{event_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))),
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: requestParameters['body'] as any,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputTransactionFromJSON(jsonValue));
}
/**
* Create a transaction by a event id
* Create Transaction
*/
async createTransactionApiTransactionEventIdPost(requestParameters: CreateTransactionApiTransactionEventIdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputTransaction> {
const response = await this.createTransactionApiTransactionEventIdPostRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get a transaction by its event and transaction id
* Get Transaction
*/
async getTransactionApiTransactionEventIdTransactionIdGetRaw(requestParameters: GetTransactionApiTransactionEventIdTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<OutputTransaction>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling getTransactionApiTransactionEventIdTransactionIdGet().'
);
}
if (requestParameters['transactionId'] == null) {
throw new runtime.RequiredError(
'transactionId',
'Required parameter "transactionId" was null or undefined when calling getTransactionApiTransactionEventIdTransactionIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/transaction/{event_id}/{transaction_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))).replace(`{${"transaction_id"}}`, encodeURIComponent(String(requestParameters['transactionId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => OutputTransactionFromJSON(jsonValue));
}
/**
* Get a transaction by its event and transaction id
* Get Transaction
*/
async getTransactionApiTransactionEventIdTransactionIdGet(requestParameters: GetTransactionApiTransactionEventIdTransactionIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<OutputTransaction> {
const response = await this.getTransactionApiTransactionEventIdTransactionIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
/**
* Get all transactions of an event
* List Transactions
*/
async listTransactionsApiTransactionEventIdGetRaw(requestParameters: ListTransactionsApiTransactionEventIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Array<OutputTransaction>>> {
if (requestParameters['eventId'] == null) {
throw new runtime.RequiredError(
'eventId',
'Required parameter "eventId" was null or undefined when calling listTransactionsApiTransactionEventIdGet().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/transaction/{event_id}`.replace(`{${"event_id"}}`, encodeURIComponent(String(requestParameters['eventId']))),
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => jsonValue.map(OutputTransactionFromJSON));
}
/**
* Get all transactions of an event
* List Transactions
*/
async listTransactionsApiTransactionEventIdGet(requestParameters: ListTransactionsApiTransactionEventIdGetRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Array<OutputTransaction>> {
const response = await this.listTransactionsApiTransactionEventIdGetRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,115 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import * as runtime from '../runtime';
import type {
BasicResponse,
HTTPValidationError,
OfdRequest,
Transaction,
} from '../models/index';
import {
BasicResponseFromJSON,
BasicResponseToJSON,
HTTPValidationErrorFromJSON,
HTTPValidationErrorToJSON,
OfdRequestFromJSON,
OfdRequestToJSON,
TransactionFromJSON,
TransactionToJSON,
} from '../models/index';
export interface OfdApiUtilsOfdPostRequest {
ofdRequest: OfdRequest;
}
/**
*
*/
export class UtilsApi extends runtime.BaseAPI {
/**
* Health Check
*/
async healthCheckApiUtilsHealthCheckGetRaw(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<{ [key: string]: string; }>> {
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
const response = await this.request({
path: `/api/utils/health-check`,
method: 'GET',
headers: headerParameters,
query: queryParameters,
}, initOverrides);
return new runtime.JSONApiResponse<any>(response);
}
/**
* Health Check
*/
async healthCheckApiUtilsHealthCheckGet(initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<{ [key: string]: string; }> {
const response = await this.healthCheckApiUtilsHealthCheckGetRaw(initOverrides);
return await response.value();
}
/**
* Get items info from OFD bare string
* Ofd
*/
async ofdApiUtilsOfdPostRaw(requestParameters: OfdApiUtilsOfdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<Transaction>> {
if (requestParameters['ofdRequest'] == null) {
throw new runtime.RequiredError(
'ofdRequest',
'Required parameter "ofdRequest" was null or undefined when calling ofdApiUtilsOfdPost().'
);
}
const queryParameters: any = {};
const headerParameters: runtime.HTTPHeaders = {};
headerParameters['Content-Type'] = 'application/json';
if (this.configuration && this.configuration.accessToken) {
const token = this.configuration.accessToken;
const tokenString = await token("BearerAuth", []);
if (tokenString) {
headerParameters["Authorization"] = `Bearer ${tokenString}`;
}
}
const response = await this.request({
path: `/api/utils/ofd`,
method: 'POST',
headers: headerParameters,
query: queryParameters,
body: OfdRequestToJSON(requestParameters['ofdRequest']),
}, initOverrides);
return new runtime.JSONApiResponse(response, (jsonValue) => TransactionFromJSON(jsonValue));
}
/**
* Get items info from OFD bare string
* Ofd
*/
async ofdApiUtilsOfdPost(requestParameters: OfdApiUtilsOfdPostRequest, initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<Transaction> {
const response = await this.ofdApiUtilsOfdPostRaw(requestParameters, initOverrides);
return await response.value();
}
}
@@ -0,0 +1,8 @@
/* tslint:disable */
/* eslint-disable */
export * from './AuthApi';
export * from './CalculateDebitsApi';
export * from './EventsApi';
export * from './ItemsApi';
export * from './TransactionsApi';
export * from './UtilsApi';
@@ -0,0 +1,5 @@
/* tslint:disable */
/* eslint-disable */
export * from './runtime';
export * from './apis/index';
export * from './models/index';
@@ -0,0 +1,66 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface AddUserRequest
*/
export interface AddUserRequest {
/**
*
* @type {number}
* @memberof AddUserRequest
*/
userId: number;
}
/**
* Check if a given object implements the AddUserRequest interface.
*/
export function instanceOfAddUserRequest(value: object): value is AddUserRequest {
if (!('userId' in value) || value['userId'] === undefined) return false;
return true;
}
export function AddUserRequestFromJSON(json: any): AddUserRequest {
return AddUserRequestFromJSONTyped(json, false);
}
export function AddUserRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): AddUserRequest {
if (json == null) {
return json;
}
return {
'userId': json['user_id'],
};
}
export function AddUserRequestToJSON(json: any): AddUserRequest {
return AddUserRequestToJSONTyped(json, false);
}
export function AddUserRequestToJSONTyped(value?: AddUserRequest | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'user_id': value['userId'],
};
}
@@ -0,0 +1,92 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface AppModelsItemItem
*/
export interface AppModelsItemItem {
/**
*
* @type {string}
* @memberof AppModelsItemItem
*/
id?: string;
/**
*
* @type {string}
* @memberof AppModelsItemItem
*/
title: string;
/**
*
* @type {number}
* @memberof AppModelsItemItem
*/
price: number;
/**
*
* @type {string}
* @memberof AppModelsItemItem
*/
transactionId: string;
}
/**
* Check if a given object implements the AppModelsItemItem interface.
*/
export function instanceOfAppModelsItemItem(value: object): value is AppModelsItemItem {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
if (!('transactionId' in value) || value['transactionId'] === undefined) return false;
return true;
}
export function AppModelsItemItemFromJSON(json: any): AppModelsItemItem {
return AppModelsItemItemFromJSONTyped(json, false);
}
export function AppModelsItemItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): AppModelsItemItem {
if (json == null) {
return json;
}
return {
'id': json['id'] == null ? undefined : json['id'],
'title': json['title'],
'price': json['price'],
'transactionId': json['transaction_id'],
};
}
export function AppModelsItemItemToJSON(json: any): AppModelsItemItem {
return AppModelsItemItemToJSONTyped(json, false);
}
export function AppModelsItemItemToJSONTyped(value?: AppModelsItemItem | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'id': value['id'],
'title': value['title'],
'price': value['price'],
'transaction_id': value['transactionId'],
};
}
@@ -0,0 +1,93 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface AppModelsOfdItem
*/
export interface AppModelsOfdItem {
/**
*
* @type {string}
* @memberof AppModelsOfdItem
*/
name: string;
/**
*
* @type {number}
* @memberof AppModelsOfdItem
*/
price: number;
/**
*
* @type {number}
* @memberof AppModelsOfdItem
*/
quantity: number;
/**
*
* @type {number}
* @memberof AppModelsOfdItem
*/
sum: number;
}
/**
* Check if a given object implements the AppModelsOfdItem interface.
*/
export function instanceOfAppModelsOfdItem(value: object): value is AppModelsOfdItem {
if (!('name' in value) || value['name'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
if (!('quantity' in value) || value['quantity'] === undefined) return false;
if (!('sum' in value) || value['sum'] === undefined) return false;
return true;
}
export function AppModelsOfdItemFromJSON(json: any): AppModelsOfdItem {
return AppModelsOfdItemFromJSONTyped(json, false);
}
export function AppModelsOfdItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): AppModelsOfdItem {
if (json == null) {
return json;
}
return {
'name': json['name'],
'price': json['price'],
'quantity': json['quantity'],
'sum': json['sum'],
};
}
export function AppModelsOfdItemToJSON(json: any): AppModelsOfdItem {
return AppModelsOfdItemToJSONTyped(json, false);
}
export function AppModelsOfdItemToJSONTyped(value?: AppModelsOfdItem | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'name': value['name'],
'price': value['price'],
'quantity': value['quantity'],
'sum': value['sum'],
};
}
@@ -0,0 +1,65 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface BaseEvent
*/
export interface BaseEvent {
/**
*
* @type {string}
* @memberof BaseEvent
*/
name?: string;
}
/**
* Check if a given object implements the BaseEvent interface.
*/
export function instanceOfBaseEvent(value: object): value is BaseEvent {
return true;
}
export function BaseEventFromJSON(json: any): BaseEvent {
return BaseEventFromJSONTyped(json, false);
}
export function BaseEventFromJSONTyped(json: any, ignoreDiscriminator: boolean): BaseEvent {
if (json == null) {
return json;
}
return {
'name': json['name'] == null ? undefined : json['name'],
};
}
export function BaseEventToJSON(json: any): BaseEvent {
return BaseEventToJSONTyped(json, false);
}
export function BaseEventToJSONTyped(value?: BaseEvent | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'name': value['name'],
};
}
@@ -0,0 +1,66 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface BasicResponse
*/
export interface BasicResponse {
/**
*
* @type {string}
* @memberof BasicResponse
*/
detail: string;
}
/**
* Check if a given object implements the BasicResponse interface.
*/
export function instanceOfBasicResponse(value: object): value is BasicResponse {
if (!('detail' in value) || value['detail'] === undefined) return false;
return true;
}
export function BasicResponseFromJSON(json: any): BasicResponse {
return BasicResponseFromJSONTyped(json, false);
}
export function BasicResponseFromJSONTyped(json: any, ignoreDiscriminator: boolean): BasicResponse {
if (json == null) {
return json;
}
return {
'detail': json['detail'],
};
}
export function BasicResponseToJSON(json: any): BasicResponse {
return BasicResponseToJSONTyped(json, false);
}
export function BasicResponseToJSONTyped(value?: BasicResponse | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'detail': value['detail'],
};
}
@@ -0,0 +1,83 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost
*/
export interface BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost {
/**
* Title of item
* @type {string}
* @memberof BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost
*/
title: string;
/**
* Price of item
* @type {number}
* @memberof BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost
*/
price: number;
/**
* Assign all users to this item
* @type {boolean}
* @memberof BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost
*/
addAllUsers?: boolean;
}
/**
* Check if a given object implements the BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost interface.
*/
export function instanceOfBodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost(value: object): value is BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
return true;
}
export function BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostFromJSON(json: any): BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost {
return BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostFromJSONTyped(json, false);
}
export function BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostFromJSONTyped(json: any, ignoreDiscriminator: boolean): BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost {
if (json == null) {
return json;
}
return {
'title': json['title'],
'price': json['price'],
'addAllUsers': json['add_all_users'] == null ? undefined : json['add_all_users'],
};
}
export function BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostToJSON(json: any): BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost {
return BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostToJSONTyped(json, false);
}
export function BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPostToJSONTyped(value?: BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'title': value['title'],
'price': value['price'],
'add_all_users': value['addAllUsers'],
};
}
@@ -0,0 +1,84 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Debt
*/
export interface Debt {
/**
*
* @type {number}
* @memberof Debt
*/
fromUserId: number;
/**
*
* @type {number}
* @memberof Debt
*/
toUserId: number;
/**
*
* @type {number}
* @memberof Debt
*/
amount: number;
}
/**
* Check if a given object implements the Debt interface.
*/
export function instanceOfDebt(value: object): value is Debt {
if (!('fromUserId' in value) || value['fromUserId'] === undefined) return false;
if (!('toUserId' in value) || value['toUserId'] === undefined) return false;
if (!('amount' in value) || value['amount'] === undefined) return false;
return true;
}
export function DebtFromJSON(json: any): Debt {
return DebtFromJSONTyped(json, false);
}
export function DebtFromJSONTyped(json: any, ignoreDiscriminator: boolean): Debt {
if (json == null) {
return json;
}
return {
'fromUserId': json['from_user_id'],
'toUserId': json['to_user_id'],
'amount': json['amount'],
};
}
export function DebtToJSON(json: any): Debt {
return DebtToJSONTyped(json, false);
}
export function DebtToJSONTyped(value?: Debt | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'from_user_id': value['fromUserId'],
'to_user_id': value['toUserId'],
'amount': value['amount'],
};
}
@@ -0,0 +1,90 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Event
*/
export interface Event {
/**
*
* @type {string}
* @memberof Event
*/
name?: string;
/**
*
* @type {string}
* @memberof Event
*/
id?: string;
/**
*
* @type {number}
* @memberof Event
*/
ownerId: number;
/**
*
* @type {string}
* @memberof Event
*/
invite?: string | null;
}
/**
* Check if a given object implements the Event interface.
*/
export function instanceOfEvent(value: object): value is Event {
if (!('ownerId' in value) || value['ownerId'] === undefined) return false;
return true;
}
export function EventFromJSON(json: any): Event {
return EventFromJSONTyped(json, false);
}
export function EventFromJSONTyped(json: any, ignoreDiscriminator: boolean): Event {
if (json == null) {
return json;
}
return {
'name': json['name'] == null ? undefined : json['name'],
'id': json['id'] == null ? undefined : json['id'],
'ownerId': json['owner_id'],
'invite': json['invite'] == null ? undefined : json['invite'],
};
}
export function EventToJSON(json: any): Event {
return EventToJSONTyped(json, false);
}
export function EventToJSONTyped(value?: Event | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'name': value['name'],
'id': value['id'],
'owner_id': value['ownerId'],
'invite': value['invite'],
};
}
@@ -0,0 +1,73 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { ValidationError } from './ValidationError';
import {
ValidationErrorFromJSON,
ValidationErrorFromJSONTyped,
ValidationErrorToJSON,
ValidationErrorToJSONTyped,
} from './ValidationError';
/**
*
* @export
* @interface HTTPValidationError
*/
export interface HTTPValidationError {
/**
*
* @type {Array<ValidationError>}
* @memberof HTTPValidationError
*/
detail?: Array<ValidationError>;
}
/**
* Check if a given object implements the HTTPValidationError interface.
*/
export function instanceOfHTTPValidationError(value: object): value is HTTPValidationError {
return true;
}
export function HTTPValidationErrorFromJSON(json: any): HTTPValidationError {
return HTTPValidationErrorFromJSONTyped(json, false);
}
export function HTTPValidationErrorFromJSONTyped(json: any, ignoreDiscriminator: boolean): HTTPValidationError {
if (json == null) {
return json;
}
return {
'detail': json['detail'] == null ? undefined : ((json['detail'] as Array<any>).map(ValidationErrorFromJSON)),
};
}
export function HTTPValidationErrorToJSON(json: any): HTTPValidationError {
return HTTPValidationErrorToJSONTyped(json, false);
}
export function HTTPValidationErrorToJSONTyped(value?: HTTPValidationError | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'detail': value['detail'] == null ? undefined : ((value['detail'] as Array<any>).map(ValidationErrorToJSON)),
};
}
@@ -0,0 +1,84 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface InputInvite
*/
export interface InputInvite {
/**
*
* @type {number}
* @memberof InputInvite
*/
usages: number;
/**
*
* @type {Date}
* @memberof InputInvite
*/
expirationDate: Date;
/**
*
* @type {number}
* @memberof InputInvite
*/
eventId: number;
}
/**
* Check if a given object implements the InputInvite interface.
*/
export function instanceOfInputInvite(value: object): value is InputInvite {
if (!('usages' in value) || value['usages'] === undefined) return false;
if (!('expirationDate' in value) || value['expirationDate'] === undefined) return false;
if (!('eventId' in value) || value['eventId'] === undefined) return false;
return true;
}
export function InputInviteFromJSON(json: any): InputInvite {
return InputInviteFromJSONTyped(json, false);
}
export function InputInviteFromJSONTyped(json: any, ignoreDiscriminator: boolean): InputInvite {
if (json == null) {
return json;
}
return {
'usages': json['usages'],
'expirationDate': (new Date(json['expiration_date'])),
'eventId': json['event_id'],
};
}
export function InputInviteToJSON(json: any): InputInvite {
return InputInviteToJSONTyped(json, false);
}
export function InputInviteToJSONTyped(value?: InputInvite | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'usages': value['usages'],
'expiration_date': ((value['expirationDate']).toISOString()),
'event_id': value['eventId'],
};
}
@@ -0,0 +1,83 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Invite
*/
export interface Invite {
/**
*
* @type {number}
* @memberof Invite
*/
usages: number;
/**
*
* @type {Date}
* @memberof Invite
*/
expirationDate: Date;
/**
*
* @type {string}
* @memberof Invite
*/
id?: string;
}
/**
* Check if a given object implements the Invite interface.
*/
export function instanceOfInvite(value: object): value is Invite {
if (!('usages' in value) || value['usages'] === undefined) return false;
if (!('expirationDate' in value) || value['expirationDate'] === undefined) return false;
return true;
}
export function InviteFromJSON(json: any): Invite {
return InviteFromJSONTyped(json, false);
}
export function InviteFromJSONTyped(json: any, ignoreDiscriminator: boolean): Invite {
if (json == null) {
return json;
}
return {
'usages': json['usages'],
'expirationDate': (new Date(json['expiration_date'])),
'id': json['id'] == null ? undefined : json['id'],
};
}
export function InviteToJSON(json: any): Invite {
return InviteToJSONTyped(json, false);
}
export function InviteToJSONTyped(value?: Invite | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'usages': value['usages'],
'expiration_date': ((value['expirationDate']).toISOString()),
'id': value['id'],
};
}
@@ -0,0 +1,92 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Item
*/
export interface Item {
/**
*
* @type {string}
* @memberof Item
*/
id?: string;
/**
*
* @type {string}
* @memberof Item
*/
title: string;
/**
*
* @type {number}
* @memberof Item
*/
price: number;
/**
*
* @type {string}
* @memberof Item
*/
transactionId: string;
}
/**
* Check if a given object implements the Item interface.
*/
export function instanceOfItem(value: object): value is Item {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
if (!('transactionId' in value) || value['transactionId'] === undefined) return false;
return true;
}
export function ItemFromJSON(json: any): Item {
return ItemFromJSONTyped(json, false);
}
export function ItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): Item {
if (json == null) {
return json;
}
return {
'id': json['id'] == null ? undefined : json['id'],
'title': json['title'],
'price': json['price'],
'transactionId': json['transaction_id'],
};
}
export function ItemToJSON(json: any): Item {
return ItemToJSONTyped(json, false);
}
export function ItemToJSONTyped(value?: Item | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'id': value['id'],
'title': value['title'],
'price': value['price'],
'transaction_id': value['transactionId'],
};
}
@@ -0,0 +1,83 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface ItemRequest
*/
export interface ItemRequest {
/**
*
* @type {string}
* @memberof ItemRequest
*/
title: string;
/**
*
* @type {number}
* @memberof ItemRequest
*/
price: number;
/**
*
* @type {boolean}
* @memberof ItemRequest
*/
allUsersSelected?: boolean;
}
/**
* Check if a given object implements the ItemRequest interface.
*/
export function instanceOfItemRequest(value: object): value is ItemRequest {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
return true;
}
export function ItemRequestFromJSON(json: any): ItemRequest {
return ItemRequestFromJSONTyped(json, false);
}
export function ItemRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): ItemRequest {
if (json == null) {
return json;
}
return {
'title': json['title'],
'price': json['price'],
'allUsersSelected': json['all_users_selected'] == null ? undefined : json['all_users_selected'],
};
}
export function ItemRequestToJSON(json: any): ItemRequest {
return ItemRequestToJSONTyped(json, false);
}
export function ItemRequestToJSONTyped(value?: ItemRequest | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'title': value['title'],
'price': value['price'],
'all_users_selected': value['allUsersSelected'],
};
}
@@ -0,0 +1,75 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface OfdRequest
*/
export interface OfdRequest {
/**
*
* @type {string}
* @memberof OfdRequest
*/
ofdString: string;
/**
*
* @type {string}
* @memberof OfdRequest
*/
eventId: string;
}
/**
* Check if a given object implements the OfdRequest interface.
*/
export function instanceOfOfdRequest(value: object): value is OfdRequest {
if (!('ofdString' in value) || value['ofdString'] === undefined) return false;
if (!('eventId' in value) || value['eventId'] === undefined) return false;
return true;
}
export function OfdRequestFromJSON(json: any): OfdRequest {
return OfdRequestFromJSONTyped(json, false);
}
export function OfdRequestFromJSONTyped(json: any, ignoreDiscriminator: boolean): OfdRequest {
if (json == null) {
return json;
}
return {
'ofdString': json['ofd_string'],
'eventId': json['event_id'],
};
}
export function OfdRequestToJSON(json: any): OfdRequest {
return OfdRequestToJSONTyped(json, false);
}
export function OfdRequestToJSONTyped(value?: OfdRequest | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'ofd_string': value['ofdString'],
'event_id': value['eventId'],
};
}
@@ -0,0 +1,110 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { User } from './User';
import {
UserFromJSON,
UserFromJSONTyped,
UserToJSON,
UserToJSONTyped,
} from './User';
/**
*
* @export
* @interface OutputEvent
*/
export interface OutputEvent {
/**
*
* @type {string}
* @memberof OutputEvent
*/
name: string;
/**
*
* @type {string}
* @memberof OutputEvent
*/
id: string;
/**
*
* @type {number}
* @memberof OutputEvent
*/
owner: number;
/**
*
* @type {Array<User>}
* @memberof OutputEvent
*/
users: Array<User>;
/**
*
* @type {string}
* @memberof OutputEvent
*/
invite: string | null;
}
/**
* Check if a given object implements the OutputEvent interface.
*/
export function instanceOfOutputEvent(value: object): value is OutputEvent {
if (!('name' in value) || value['name'] === undefined) return false;
if (!('id' in value) || value['id'] === undefined) return false;
if (!('owner' in value) || value['owner'] === undefined) return false;
if (!('users' in value) || value['users'] === undefined) return false;
if (!('invite' in value) || value['invite'] === undefined) return false;
return true;
}
export function OutputEventFromJSON(json: any): OutputEvent {
return OutputEventFromJSONTyped(json, false);
}
export function OutputEventFromJSONTyped(json: any, ignoreDiscriminator: boolean): OutputEvent {
if (json == null) {
return json;
}
return {
'name': json['name'],
'id': json['id'],
'owner': json['owner'],
'users': ((json['users'] as Array<any>).map(UserFromJSON)),
'invite': json['invite'],
};
}
export function OutputEventToJSON(json: any): OutputEvent {
return OutputEventToJSONTyped(json, false);
}
export function OutputEventToJSONTyped(value?: OutputEvent | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'name': value['name'],
'id': value['id'],
'owner': value['owner'],
'users': ((value['users'] as Array<any>).map(UserToJSON)),
'invite': value['invite'],
};
}
@@ -0,0 +1,110 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { User } from './User';
import {
UserFromJSON,
UserFromJSONTyped,
UserToJSON,
UserToJSONTyped,
} from './User';
/**
*
* @export
* @interface OutputItem
*/
export interface OutputItem {
/**
*
* @type {string}
* @memberof OutputItem
*/
id: string;
/**
*
* @type {string}
* @memberof OutputItem
*/
title: string;
/**
*
* @type {number}
* @memberof OutputItem
*/
price: number;
/**
*
* @type {Array<User>}
* @memberof OutputItem
*/
assignedTo: Array<User>;
/**
*
* @type {string}
* @memberof OutputItem
*/
transactionId: string;
}
/**
* Check if a given object implements the OutputItem interface.
*/
export function instanceOfOutputItem(value: object): value is OutputItem {
if (!('id' in value) || value['id'] === undefined) return false;
if (!('title' in value) || value['title'] === undefined) return false;
if (!('price' in value) || value['price'] === undefined) return false;
if (!('assignedTo' in value) || value['assignedTo'] === undefined) return false;
if (!('transactionId' in value) || value['transactionId'] === undefined) return false;
return true;
}
export function OutputItemFromJSON(json: any): OutputItem {
return OutputItemFromJSONTyped(json, false);
}
export function OutputItemFromJSONTyped(json: any, ignoreDiscriminator: boolean): OutputItem {
if (json == null) {
return json;
}
return {
'id': json['id'],
'title': json['title'],
'price': json['price'],
'assignedTo': ((json['assigned_to'] as Array<any>).map(UserFromJSON)),
'transactionId': json['transaction_id'],
};
}
export function OutputItemToJSON(json: any): OutputItem {
return OutputItemToJSONTyped(json, false);
}
export function OutputItemToJSONTyped(value?: OutputItem | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'id': value['id'],
'title': value['title'],
'price': value['price'],
'assigned_to': ((value['assignedTo'] as Array<any>).map(UserToJSON)),
'transaction_id': value['transactionId'],
};
}
@@ -0,0 +1,126 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { Item } from './Item';
import {
ItemFromJSON,
ItemFromJSONTyped,
ItemToJSON,
ItemToJSONTyped,
} from './Item';
import type { User } from './User';
import {
UserFromJSON,
UserFromJSONTyped,
UserToJSON,
UserToJSONTyped,
} from './User';
/**
*
* @export
* @interface OutputTransaction
*/
export interface OutputTransaction {
/**
*
* @type {string}
* @memberof OutputTransaction
*/
title: string;
/**
*
* @type {string}
* @memberof OutputTransaction
*/
id: string;
/**
*
* @type {User}
* @memberof OutputTransaction
*/
payer: User;
/**
*
* @type {string}
* @memberof OutputTransaction
*/
eventId: string;
/**
*
* @type {boolean}
* @memberof OutputTransaction
*/
closed: boolean;
/**
*
* @type {Array<Item>}
* @memberof OutputTransaction
*/
items: Array<Item>;
}
/**
* Check if a given object implements the OutputTransaction interface.
*/
export function instanceOfOutputTransaction(value: object): value is OutputTransaction {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('id' in value) || value['id'] === undefined) return false;
if (!('payer' in value) || value['payer'] === undefined) return false;
if (!('eventId' in value) || value['eventId'] === undefined) return false;
if (!('closed' in value) || value['closed'] === undefined) return false;
if (!('items' in value) || value['items'] === undefined) return false;
return true;
}
export function OutputTransactionFromJSON(json: any): OutputTransaction {
return OutputTransactionFromJSONTyped(json, false);
}
export function OutputTransactionFromJSONTyped(json: any, ignoreDiscriminator: boolean): OutputTransaction {
if (json == null) {
return json;
}
return {
'title': json['title'],
'id': json['id'],
'payer': UserFromJSON(json['payer']),
'eventId': json['event_id'],
'closed': json['closed'],
'items': ((json['items'] as Array<any>).map(ItemFromJSON)),
};
}
export function OutputTransactionToJSON(json: any): OutputTransaction {
return OutputTransactionToJSONTyped(json, false);
}
export function OutputTransactionToJSONTyped(value?: OutputTransaction | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'title': value['title'],
'id': value['id'],
'payer': UserToJSON(value['payer']),
'event_id': value['eventId'],
'closed': value['closed'],
'items': ((value['items'] as Array<any>).map(ItemToJSON)),
};
}
@@ -0,0 +1,148 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { TelegramWebUser } from './TelegramWebUser';
import {
TelegramWebUserFromJSON,
TelegramWebUserFromJSONTyped,
TelegramWebUserToJSON,
TelegramWebUserToJSONTyped,
} from './TelegramWebUser';
/**
*
* @export
* @interface TelegramInputData
*/
export interface TelegramInputData {
/**
*
* @type {string}
* @memberof TelegramInputData
*/
queryId?: string | null;
/**
*
* @type {TelegramWebUser}
* @memberof TelegramInputData
*/
user: TelegramWebUser;
/**
*
* @type {any}
* @memberof TelegramInputData
*/
receiver?: any | null;
/**
*
* @type {any}
* @memberof TelegramInputData
*/
chat?: any | null;
/**
*
* @type {string}
* @memberof TelegramInputData
*/
chatType?: string | null;
/**
*
* @type {string}
* @memberof TelegramInputData
*/
chatInstance?: string | null;
/**
*
* @type {string}
* @memberof TelegramInputData
*/
startParam?: string | null;
/**
*
* @type {number}
* @memberof TelegramInputData
*/
canSendAfter?: number | null;
/**
*
* @type {number}
* @memberof TelegramInputData
*/
authDate: number;
/**
*
* @type {string}
* @memberof TelegramInputData
*/
hash: string;
}
/**
* Check if a given object implements the TelegramInputData interface.
*/
export function instanceOfTelegramInputData(value: object): value is TelegramInputData {
if (!('user' in value) || value['user'] === undefined) return false;
if (!('authDate' in value) || value['authDate'] === undefined) return false;
if (!('hash' in value) || value['hash'] === undefined) return false;
return true;
}
export function TelegramInputDataFromJSON(json: any): TelegramInputData {
return TelegramInputDataFromJSONTyped(json, false);
}
export function TelegramInputDataFromJSONTyped(json: any, ignoreDiscriminator: boolean): TelegramInputData {
if (json == null) {
return json;
}
return {
'queryId': json['query_id'] == null ? undefined : json['query_id'],
'user': TelegramWebUserFromJSON(json['user']),
'receiver': json['receiver'] == null ? undefined : json['receiver'],
'chat': json['chat'] == null ? undefined : json['chat'],
'chatType': json['chat_type'] == null ? undefined : json['chat_type'],
'chatInstance': json['chat_instance'] == null ? undefined : json['chat_instance'],
'startParam': json['start_param'] == null ? undefined : json['start_param'],
'canSendAfter': json['can_send_after'] == null ? undefined : json['can_send_after'],
'authDate': json['auth_date'],
'hash': json['hash'],
};
}
export function TelegramInputDataToJSON(json: any): TelegramInputData {
return TelegramInputDataToJSONTyped(json, false);
}
export function TelegramInputDataToJSONTyped(value?: TelegramInputData | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'query_id': value['queryId'],
'user': TelegramWebUserToJSON(value['user']),
'receiver': value['receiver'],
'chat': value['chat'],
'chat_type': value['chatType'],
'chat_instance': value['chatInstance'],
'start_param': value['startParam'],
'can_send_after': value['canSendAfter'],
'auth_date': value['authDate'],
'hash': value['hash'],
};
}
@@ -0,0 +1,131 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface TelegramWebUser
*/
export interface TelegramWebUser {
/**
*
* @type {number}
* @memberof TelegramWebUser
*/
id: number;
/**
*
* @type {string}
* @memberof TelegramWebUser
*/
firstName: string;
/**
*
* @type {string}
* @memberof TelegramWebUser
*/
lastName?: string | null;
/**
*
* @type {string}
* @memberof TelegramWebUser
*/
username?: string | null;
/**
*
* @type {string}
* @memberof TelegramWebUser
*/
languageCode?: string | null;
/**
*
* @type {boolean}
* @memberof TelegramWebUser
*/
isPremium?: boolean;
/**
*
* @type {boolean}
* @memberof TelegramWebUser
*/
addedToAttachmentMenu?: boolean;
/**
*
* @type {boolean}
* @memberof TelegramWebUser
*/
allowsWriteToPm?: boolean;
/**
*
* @type {string}
* @memberof TelegramWebUser
*/
photoUrl?: string | null;
}
/**
* Check if a given object implements the TelegramWebUser interface.
*/
export function instanceOfTelegramWebUser(value: object): value is TelegramWebUser {
if (!('id' in value) || value['id'] === undefined) return false;
if (!('firstName' in value) || value['firstName'] === undefined) return false;
return true;
}
export function TelegramWebUserFromJSON(json: any): TelegramWebUser {
return TelegramWebUserFromJSONTyped(json, false);
}
export function TelegramWebUserFromJSONTyped(json: any, ignoreDiscriminator: boolean): TelegramWebUser {
if (json == null) {
return json;
}
return {
'id': json['id'],
'firstName': json['first_name'],
'lastName': json['last_name'] == null ? undefined : json['last_name'],
'username': json['username'] == null ? undefined : json['username'],
'languageCode': json['language_code'] == null ? undefined : json['language_code'],
'isPremium': json['is_premium'] == null ? undefined : json['is_premium'],
'addedToAttachmentMenu': json['added_to_attachment_menu'] == null ? undefined : json['added_to_attachment_menu'],
'allowsWriteToPm': json['allows_write_to_pm'] == null ? undefined : json['allows_write_to_pm'],
'photoUrl': json['photo_url'] == null ? undefined : json['photo_url'],
};
}
export function TelegramWebUserToJSON(json: any): TelegramWebUser {
return TelegramWebUserToJSONTyped(json, false);
}
export function TelegramWebUserToJSONTyped(value?: TelegramWebUser | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'id': value['id'],
'first_name': value['firstName'],
'last_name': value['lastName'],
'username': value['username'],
'language_code': value['languageCode'],
'is_premium': value['isPremium'],
'added_to_attachment_menu': value['addedToAttachmentMenu'],
'allows_write_to_pm': value['allowsWriteToPm'],
'photo_url': value['photoUrl'],
};
}
@@ -0,0 +1,75 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Token
*/
export interface Token {
/**
*
* @type {string}
* @memberof Token
*/
accessToken: string;
/**
*
* @type {string}
* @memberof Token
*/
tokenType: string;
}
/**
* Check if a given object implements the Token interface.
*/
export function instanceOfToken(value: object): value is Token {
if (!('accessToken' in value) || value['accessToken'] === undefined) return false;
if (!('tokenType' in value) || value['tokenType'] === undefined) return false;
return true;
}
export function TokenFromJSON(json: any): Token {
return TokenFromJSONTyped(json, false);
}
export function TokenFromJSONTyped(json: any, ignoreDiscriminator: boolean): Token {
if (json == null) {
return json;
}
return {
'accessToken': json['access_token'],
'tokenType': json['token_type'],
};
}
export function TokenToJSON(json: any): Token {
return TokenToJSONTyped(json, false);
}
export function TokenToJSONTyped(value?: Token | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'access_token': value['accessToken'],
'token_type': value['tokenType'],
};
}
@@ -0,0 +1,100 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface Transaction
*/
export interface Transaction {
/**
*
* @type {string}
* @memberof Transaction
*/
title: string;
/**
*
* @type {string}
* @memberof Transaction
*/
id?: string;
/**
*
* @type {number}
* @memberof Transaction
*/
payerId: number;
/**
*
* @type {string}
* @memberof Transaction
*/
eventId: string;
/**
*
* @type {boolean}
* @memberof Transaction
*/
closed?: boolean;
}
/**
* Check if a given object implements the Transaction interface.
*/
export function instanceOfTransaction(value: object): value is Transaction {
if (!('title' in value) || value['title'] === undefined) return false;
if (!('payerId' in value) || value['payerId'] === undefined) return false;
if (!('eventId' in value) || value['eventId'] === undefined) return false;
return true;
}
export function TransactionFromJSON(json: any): Transaction {
return TransactionFromJSONTyped(json, false);
}
export function TransactionFromJSONTyped(json: any, ignoreDiscriminator: boolean): Transaction {
if (json == null) {
return json;
}
return {
'title': json['title'],
'id': json['id'] == null ? undefined : json['id'],
'payerId': json['payer_id'],
'eventId': json['event_id'],
'closed': json['closed'] == null ? undefined : json['closed'],
};
}
export function TransactionToJSON(json: any): Transaction {
return TransactionToJSONTyped(json, false);
}
export function TransactionToJSONTyped(value?: Transaction | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'title': value['title'],
'id': value['id'],
'payer_id': value['payerId'],
'event_id': value['eventId'],
'closed': value['closed'],
};
}
@@ -0,0 +1,75 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface User
*/
export interface User {
/**
*
* @type {number}
* @memberof User
*/
id: number;
/**
*
* @type {string}
* @memberof User
*/
username: string;
}
/**
* Check if a given object implements the User interface.
*/
export function instanceOfUser(value: object): value is User {
if (!('id' in value) || value['id'] === undefined) return false;
if (!('username' in value) || value['username'] === undefined) return false;
return true;
}
export function UserFromJSON(json: any): User {
return UserFromJSONTyped(json, false);
}
export function UserFromJSONTyped(json: any, ignoreDiscriminator: boolean): User {
if (json == null) {
return json;
}
return {
'id': json['id'],
'username': json['username'],
};
}
export function UserToJSON(json: any): User {
return UserToJSONTyped(json, false);
}
export function UserToJSONTyped(value?: User | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'id': value['id'],
'username': value['username'],
};
}
@@ -0,0 +1,92 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
import type { ValidationErrorLocInner } from './ValidationErrorLocInner';
import {
ValidationErrorLocInnerFromJSON,
ValidationErrorLocInnerFromJSONTyped,
ValidationErrorLocInnerToJSON,
ValidationErrorLocInnerToJSONTyped,
} from './ValidationErrorLocInner';
/**
*
* @export
* @interface ValidationError
*/
export interface ValidationError {
/**
*
* @type {Array<ValidationErrorLocInner>}
* @memberof ValidationError
*/
loc: Array<ValidationErrorLocInner>;
/**
*
* @type {string}
* @memberof ValidationError
*/
msg: string;
/**
*
* @type {string}
* @memberof ValidationError
*/
type: string;
}
/**
* Check if a given object implements the ValidationError interface.
*/
export function instanceOfValidationError(value: object): value is ValidationError {
if (!('loc' in value) || value['loc'] === undefined) return false;
if (!('msg' in value) || value['msg'] === undefined) return false;
if (!('type' in value) || value['type'] === undefined) return false;
return true;
}
export function ValidationErrorFromJSON(json: any): ValidationError {
return ValidationErrorFromJSONTyped(json, false);
}
export function ValidationErrorFromJSONTyped(json: any, ignoreDiscriminator: boolean): ValidationError {
if (json == null) {
return json;
}
return {
'loc': ((json['loc'] as Array<any>).map(ValidationErrorLocInnerFromJSON)),
'msg': json['msg'],
'type': json['type'],
};
}
export function ValidationErrorToJSON(json: any): ValidationError {
return ValidationErrorToJSONTyped(json, false);
}
export function ValidationErrorToJSONTyped(value?: ValidationError | null, ignoreDiscriminator: boolean = false): any {
if (value == null) {
return value;
}
return {
'loc': ((value['loc'] as Array<any>).map(ValidationErrorLocInnerToJSON)),
'msg': value['msg'],
'type': value['type'],
};
}
@@ -0,0 +1,46 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
import { mapValues } from '../runtime';
/**
*
* @export
* @interface ValidationErrorLocInner
*/
export interface ValidationErrorLocInner {
}
/**
* Check if a given object implements the ValidationErrorLocInner interface.
*/
export function instanceOfValidationErrorLocInner(value: object): value is ValidationErrorLocInner {
return true;
}
export function ValidationErrorLocInnerFromJSON(json: any): ValidationErrorLocInner {
return ValidationErrorLocInnerFromJSONTyped(json, false);
}
export function ValidationErrorLocInnerFromJSONTyped(json: any, ignoreDiscriminator: boolean): ValidationErrorLocInner {
return json;
}
export function ValidationErrorLocInnerToJSON(json: any): ValidationErrorLocInner {
return ValidationErrorLocInnerToJSONTyped(json, false);
}
export function ValidationErrorLocInnerToJSONTyped(value?: ValidationErrorLocInner | null, ignoreDiscriminator: boolean = false): any {
return value;
}
@@ -0,0 +1,21 @@
/* tslint:disable */
/* eslint-disable */
export * from './BaseEvent';
export * from './BasicResponse';
export * from './BodyAddItemToTransactionApiTransactionEventIdTransactionIdItemsPost';
export * from './Debt';
export * from './Event';
export * from './HTTPValidationError';
export * from './Item';
export * from './ItemRequest';
export * from './OfdRequest';
export * from './OutputEvent';
export * from './OutputItem';
export * from './OutputTransaction';
export * from './TelegramInputData';
export * from './TelegramWebUser';
export * from './Token';
export * from './Transaction';
export * from './User';
export * from './ValidationError';
export * from './ValidationErrorLocInner';
@@ -0,0 +1,426 @@
/* tslint:disable */
/* eslint-disable */
/**
* FastAPI
* No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
*
* The version of the OpenAPI document: 0.1.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export const BASE_PATH = "http://localhost".replace(/\/+$/, "");
export interface ConfigurationParameters {
basePath?: string; // override base path
fetchApi?: FetchAPI; // override for fetch implementation
middleware?: Middleware[]; // middleware to apply before/after fetch requests
queryParamsStringify?: (params: HTTPQuery) => string; // stringify function for query strings
username?: string; // parameter for basic security
password?: string; // parameter for basic security
apiKey?: string | Promise<string> | ((name: string) => string | Promise<string>); // parameter for apiKey security
accessToken?: string | Promise<string> | ((name?: string, scopes?: string[]) => string | Promise<string>); // parameter for oauth2 security
headers?: HTTPHeaders; //header params we want to use on every request
credentials?: RequestCredentials; //value for the credentials param we want to use on each request
}
export class Configuration {
constructor(private configuration: ConfigurationParameters = {}) {}
set config(configuration: Configuration) {
this.configuration = configuration;
}
get basePath(): string {
return this.configuration.basePath != null ? this.configuration.basePath : BASE_PATH;
}
get fetchApi(): FetchAPI | undefined {
return this.configuration.fetchApi;
}
get middleware(): Middleware[] {
return this.configuration.middleware || [];
}
get queryParamsStringify(): (params: HTTPQuery) => string {
return this.configuration.queryParamsStringify || querystring;
}
get username(): string | undefined {
return this.configuration.username;
}
get password(): string | undefined {
return this.configuration.password;
}
get apiKey(): ((name: string) => string | Promise<string>) | undefined {
const apiKey = this.configuration.apiKey;
if (apiKey) {
return typeof apiKey === 'function' ? apiKey : () => apiKey;
}
return undefined;
}
get accessToken(): ((name?: string, scopes?: string[]) => string | Promise<string>) | undefined {
const accessToken = this.configuration.accessToken;
if (accessToken) {
return typeof accessToken === 'function' ? accessToken : async () => accessToken;
}
return undefined;
}
get headers(): HTTPHeaders | undefined {
return this.configuration.headers;
}
get credentials(): RequestCredentials | undefined {
return this.configuration.credentials;
}
}
export const DefaultConfig = new Configuration();
/**
* This is the base class for all generated API classes.
*/
export class BaseAPI {
private static readonly jsonRegex = new RegExp('^(:?application\/json|[^;/ \t]+\/[^;/ \t]+[+]json)[ \t]*(:?;.*)?$', 'i');
private middleware: Middleware[];
constructor(protected configuration = DefaultConfig) {
this.middleware = configuration.middleware;
}
withMiddleware<T extends BaseAPI>(this: T, ...middlewares: Middleware[]) {
const next = this.clone<T>();
next.middleware = next.middleware.concat(...middlewares);
return next;
}
withPreMiddleware<T extends BaseAPI>(this: T, ...preMiddlewares: Array<Middleware['pre']>) {
const middlewares = preMiddlewares.map((pre) => ({ pre }));
return this.withMiddleware<T>(...middlewares);
}
withPostMiddleware<T extends BaseAPI>(this: T, ...postMiddlewares: Array<Middleware['post']>) {
const middlewares = postMiddlewares.map((post) => ({ post }));
return this.withMiddleware<T>(...middlewares);
}
/**
* Check if the given MIME is a JSON MIME.
* JSON MIME examples:
* application/json
* application/json; charset=UTF8
* APPLICATION/JSON
* application/vnd.company+json
* @param mime - MIME (Multipurpose Internet Mail Extensions)
* @return True if the given MIME is JSON, false otherwise.
*/
protected isJsonMime(mime: string | null | undefined): boolean {
if (!mime) {
return false;
}
return BaseAPI.jsonRegex.test(mime);
}
protected async request(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction): Promise<Response> {
const { url, init } = await this.createFetchParams(context, initOverrides);
const response = await this.fetchApi(url, init);
if (response && (response.status >= 200 && response.status < 300)) {
return response;
}
throw new ResponseError(response, 'Response returned an error code');
}
private async createFetchParams(context: RequestOpts, initOverrides?: RequestInit | InitOverrideFunction) {
let url = this.configuration.basePath + context.path;
if (context.query !== undefined && Object.keys(context.query).length !== 0) {
// only add the querystring to the URL if there are query parameters.
// this is done to avoid urls ending with a "?" character which buggy webservers
// do not handle correctly sometimes.
url += '?' + this.configuration.queryParamsStringify(context.query);
}
const headers = Object.assign({}, this.configuration.headers, context.headers);
Object.keys(headers).forEach(key => headers[key] === undefined ? delete headers[key] : {});
const initOverrideFn =
typeof initOverrides === "function"
? initOverrides
: async () => initOverrides;
const initParams = {
method: context.method,
headers,
body: context.body,
credentials: this.configuration.credentials,
};
const overriddenInit: RequestInit = {
...initParams,
...(await initOverrideFn({
init: initParams,
context,
}))
};
let body: any;
if (isFormData(overriddenInit.body)
|| (overriddenInit.body instanceof URLSearchParams)
|| isBlob(overriddenInit.body)) {
body = overriddenInit.body;
} else if (this.isJsonMime(headers['Content-Type'])) {
body = JSON.stringify(overriddenInit.body);
} else {
body = overriddenInit.body;
}
const init: RequestInit = {
...overriddenInit,
body
};
return { url, init };
}
private fetchApi = async (url: string, init: RequestInit) => {
let fetchParams = { url, init };
for (const middleware of this.middleware) {
if (middleware.pre) {
fetchParams = await middleware.pre({
fetch: this.fetchApi,
...fetchParams,
}) || fetchParams;
}
}
let response: Response | undefined = undefined;
try {
response = await (this.configuration.fetchApi || fetch)(fetchParams.url, fetchParams.init);
} catch (e) {
for (const middleware of this.middleware) {
if (middleware.onError) {
response = await middleware.onError({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
error: e,
response: response ? response.clone() : undefined,
}) || response;
}
}
if (response === undefined) {
if (e instanceof Error) {
throw new FetchError(e, 'The request failed and the interceptors did not return an alternative response');
} else {
throw e;
}
}
}
for (const middleware of this.middleware) {
if (middleware.post) {
response = await middleware.post({
fetch: this.fetchApi,
url: fetchParams.url,
init: fetchParams.init,
response: response.clone(),
}) || response;
}
}
return response;
}
/**
* Create a shallow clone of `this` by constructing a new instance
* and then shallow cloning data members.
*/
private clone<T extends BaseAPI>(this: T): T {
const constructor = this.constructor as any;
const next = new constructor(this.configuration);
next.middleware = this.middleware.slice();
return next;
}
};
function isBlob(value: any): value is Blob {
return typeof Blob !== 'undefined' && value instanceof Blob;
}
function isFormData(value: any): value is FormData {
return typeof FormData !== "undefined" && value instanceof FormData;
}
export class ResponseError extends Error {
override name: "ResponseError" = "ResponseError";
constructor(public response: Response, msg?: string) {
super(msg);
}
}
export class FetchError extends Error {
override name: "FetchError" = "FetchError";
constructor(public cause: Error, msg?: string) {
super(msg);
}
}
export class RequiredError extends Error {
override name: "RequiredError" = "RequiredError";
constructor(public field: string, msg?: string) {
super(msg);
}
}
export const COLLECTION_FORMATS = {
csv: ",",
ssv: " ",
tsv: "\t",
pipes: "|",
};
export type FetchAPI = WindowOrWorkerGlobalScope['fetch'];
export type Json = any;
export type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
export type HTTPHeaders = { [key: string]: string };
export type HTTPQuery = { [key: string]: string | number | null | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery };
export type HTTPBody = Json | FormData | URLSearchParams;
export type HTTPRequestInit = { headers?: HTTPHeaders; method: HTTPMethod; credentials?: RequestCredentials; body?: HTTPBody };
export type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | 'original';
export type InitOverrideFunction = (requestContext: { init: HTTPRequestInit, context: RequestOpts }) => Promise<RequestInit>
export interface FetchParams {
url: string;
init: RequestInit;
}
export interface RequestOpts {
path: string;
method: HTTPMethod;
headers: HTTPHeaders;
query?: HTTPQuery;
body?: HTTPBody;
}
export function querystring(params: HTTPQuery, prefix: string = ''): string {
return Object.keys(params)
.map(key => querystringSingleKey(key, params[key], prefix))
.filter(part => part.length > 0)
.join('&');
}
function querystringSingleKey(key: string, value: string | number | null | undefined | boolean | Array<string | number | null | boolean> | Set<string | number | null | boolean> | HTTPQuery, keyPrefix: string = ''): string {
const fullKey = keyPrefix + (keyPrefix.length ? `[${key}]` : key);
if (value instanceof Array) {
const multiValue = value.map(singleValue => encodeURIComponent(String(singleValue)))
.join(`&${encodeURIComponent(fullKey)}=`);
return `${encodeURIComponent(fullKey)}=${multiValue}`;
}
if (value instanceof Set) {
const valueAsArray = Array.from(value);
return querystringSingleKey(key, valueAsArray, keyPrefix);
}
if (value instanceof Date) {
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(value.toISOString())}`;
}
if (value instanceof Object) {
return querystring(value as HTTPQuery, fullKey);
}
return `${encodeURIComponent(fullKey)}=${encodeURIComponent(String(value))}`;
}
export function mapValues(data: any, fn: (item: any) => any) {
return Object.keys(data).reduce(
(acc, key) => ({ ...acc, [key]: fn(data[key]) }),
{}
);
}
export function canConsumeForm(consumes: Consume[]): boolean {
for (const consume of consumes) {
if ('multipart/form-data' === consume.contentType) {
return true;
}
}
return false;
}
export interface Consume {
contentType: string;
}
export interface RequestContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
}
export interface ResponseContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
response: Response;
}
export interface ErrorContext {
fetch: FetchAPI;
url: string;
init: RequestInit;
error: unknown;
response?: Response;
}
export interface Middleware {
pre?(context: RequestContext): Promise<FetchParams | void>;
post?(context: ResponseContext): Promise<Response | void>;
onError?(context: ErrorContext): Promise<Response | void>;
}
export interface ApiResponse<T> {
raw: Response;
value(): Promise<T>;
}
export interface ResponseTransformer<T> {
(json: any): T;
}
export class JSONApiResponse<T> {
constructor(public raw: Response, private transformer: ResponseTransformer<T> = (jsonValue: any) => jsonValue) {}
async value(): Promise<T> {
return this.transformer(await this.raw.json());
}
}
export class VoidApiResponse {
constructor(public raw: Response) {}
async value(): Promise<void> {
return undefined;
}
}
export class BlobApiResponse {
constructor(public raw: Response) {}
async value(): Promise<Blob> {
return await this.raw.blob();
};
}
export class TextApiResponse {
constructor(public raw: Response) {}
async value(): Promise<string> {
return await this.raw.text();
};
}
+23
View File
@@ -0,0 +1,23 @@
import { Configuration, AuthApi, EventsApi, UtilsApi, ItemsApi, TransactionsApi, CalculateDebitsApi } from "./generated";
export const c = new Configuration({
basePath: import.meta.env.VITE_API_URL,
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${localStorage.getItem('token')}`,
}
});
export const authApi = new AuthApi(c)
export const eventsApi = new EventsApi(c)
export const utilsApi = new UtilsApi(c)
export const calculateDebitsApi = new CalculateDebitsApi(c)
export const transactionsApi = new TransactionsApi(c)
export const itemsApi = new ItemsApi(c)
export const defaultReq = {
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${localStorage.getItem('token')}`,
}
}
+6
View File
@@ -0,0 +1,6 @@
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
+57
View File
@@ -0,0 +1,57 @@
import * as React from "react";
import { Slot } from "@radix-ui/react-slot";
import { cva, type VariantProps } from "class-variance-authority";
import { cn } from "@/shared/lib/utils";
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow hover:bg-primary/90",
destructive:
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
outline:
"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
secondary:
"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2",
sm: "h-8 rounded-md px-3 text-xs",
lg: "h-10 rounded-md px-8",
icon: "h-9 w-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
);
export interface ButtonProps
extends React.ButtonHTMLAttributes<HTMLButtonElement>,
VariantProps<typeof buttonVariants> {
asChild?: boolean;
}
const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
({ className, variant, size, asChild = false, ...props }, ref) => {
const Comp = asChild ? Slot : "button";
return (
<Comp
className={cn(buttonVariants({ variant, size, className }))}
ref={ref}
{...props}
/>
);
}
);
Button.displayName = "Button";
export { Button, buttonVariants };
+120
View File
@@ -0,0 +1,120 @@
import * as React from "react"
import * as DialogPrimitive from "@radix-ui/react-dialog"
import { X } from "lucide-react"
import { cn } from "@/shared/lib/utils"
const Dialog = DialogPrimitive.Root
const DialogTrigger = DialogPrimitive.Trigger
const DialogPortal = DialogPrimitive.Portal
const DialogClose = DialogPrimitive.Close
const DialogOverlay = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Overlay
ref={ref}
className={cn(
"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
className
)}
{...props}
/>
))
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName
const DialogContent = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>
>(({ className, children, ...props }, ref) => (
<DialogPortal>
<DialogOverlay />
<DialogPrimitive.Content
ref={ref}
className={cn(
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
className
)}
{...props}
>
{children}
<DialogPrimitive.Close className="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
<X className="h-4 w-4" />
<span className="sr-only">Close</span>
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
))
DialogContent.displayName = DialogPrimitive.Content.displayName
const DialogHeader = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col space-y-1.5 text-center sm:text-left",
className
)}
{...props}
/>
)
DialogHeader.displayName = "DialogHeader"
const DialogFooter = ({
className,
...props
}: React.HTMLAttributes<HTMLDivElement>) => (
<div
className={cn(
"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
className
)}
{...props}
/>
)
DialogFooter.displayName = "DialogFooter"
const DialogTitle = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Title
ref={ref}
className={cn(
"text-lg font-semibold leading-none tracking-tight",
className
)}
{...props}
/>
))
DialogTitle.displayName = DialogPrimitive.Title.displayName
const DialogDescription = React.forwardRef<
React.ElementRef<typeof DialogPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>
>(({ className, ...props }, ref) => (
<DialogPrimitive.Description
ref={ref}
className={cn("text-sm text-muted-foreground", className)}
{...props}
/>
))
DialogDescription.displayName = DialogPrimitive.Description.displayName
export {
Dialog,
DialogPortal,
DialogOverlay,
DialogTrigger,
DialogClose,
DialogContent,
DialogHeader,
DialogFooter,
DialogTitle,
DialogDescription,
}
+22
View File
@@ -0,0 +1,22 @@
import * as React from "react"
import { cn } from "@/shared/lib/utils"
const Input = React.forwardRef<HTMLInputElement, React.ComponentProps<"input">>(
({ className, type, ...props }, ref) => {
return (
<input
type={type}
className={cn(
"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
className
)}
ref={ref}
{...props}
/>
)
}
)
Input.displayName = "Input"
export { Input }
+46
View File
@@ -0,0 +1,46 @@
import * as React from "react"
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area"
import { cn } from "@/lib/utils"
const ScrollArea = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>
>(({ className, children, ...props }, ref) => (
<ScrollAreaPrimitive.Root
ref={ref}
className={cn("relative overflow-hidden", className)}
{...props}
>
<ScrollAreaPrimitive.Viewport className="h-full w-full rounded-[inherit]">
{children}
</ScrollAreaPrimitive.Viewport>
<ScrollBar />
<ScrollAreaPrimitive.Corner />
</ScrollAreaPrimitive.Root>
))
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName
const ScrollBar = React.forwardRef<
React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,
React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>
>(({ className, orientation = "vertical", ...props }, ref) => (
<ScrollAreaPrimitive.ScrollAreaScrollbar
ref={ref}
orientation={orientation}
className={cn(
"flex touch-none select-none transition-colors",
orientation === "vertical" &&
"h-full w-2.5 border-l border-l-transparent p-[1px]",
orientation === "horizontal" &&
"h-2.5 flex-col border-t border-t-transparent p-[1px]",
className
)}
{...props}
>
<ScrollAreaPrimitive.ScrollAreaThumb className="relative flex-1 rounded-full bg-border" />
</ScrollAreaPrimitive.ScrollAreaScrollbar>
))
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName
export { ScrollArea, ScrollBar }

Some files were not shown because too many files have changed in this diff Show More