Skip to content
Snippets Groups Projects
Commit 0b882111 authored by Aaron Dötsch's avatar Aaron Dötsch
Browse files

Refactor parts of codebase to TypeScript

parent 45155661
No related branches found
No related tags found
No related merge requests found
<script> <script lang="ts">
import { scale } from "svelte/transition"; import { scale } from "svelte/transition";
import { removeMessage } from "$lib/messages"; import { removeMessage } from "$lib/messages.js";
export let message; import type { Message } from "$lib/messages.js";
export let message: Message;
</script> </script>
<style> <style>
......
<script> <script>
import { messageStore } from "$lib/messages"; import { messageStore } from "$lib/messages";
import Message from "./Message.svelte"; import Message from "./Message.svelte";
let messages;
messageStore.subscribe(val=>messages=val);
</script> </script>
<style> <style>
...@@ -16,7 +14,7 @@ ...@@ -16,7 +14,7 @@
</style> </style>
<div class="messages"> <div class="messages">
{#each messages as message (message.id)} {#each $messageStore as message (message.id)}
<Message {message} /> <Message {message} />
{/each} {/each}
</div> </div>
File moved
File moved
import { browser } from "$app/environment"; import { browser } from "$app/environment";
const functions = new Map(); type InputHandler = (input: string) => any;
export function addInputHandler(handler, splitOnNewline = true) { const functions: Map<InputHandler, {keydown: (e: KeyboardEvent)=>void, paste: (e: ClipboardEvent)=>void}> = new Map();
export function addInputHandler(handler: InputHandler, splitOnNewline: boolean = true): ()=>void {
if(!browser) return; if(!browser) return;
let input = ""; let input = "";
const keydown = (e) => { const keydown = (e: KeyboardEvent) => {
if(e.key === "Enter"){ if(e.key === "Enter"){
handler(input); handler(input);
input = ""; input = "";
...@@ -19,7 +21,7 @@ export function addInputHandler(handler, splitOnNewline = true) { ...@@ -19,7 +21,7 @@ export function addInputHandler(handler, splitOnNewline = true) {
input += e.key; input += e.key;
} }
}; };
const paste = (e) => { const paste = (e: ClipboardEvent) => {
const text = e.clipboardData.getData("text"); const text = e.clipboardData.getData("text");
const lines = splitOnNewline ? text.split("\n") : [text]; const lines = splitOnNewline ? text.split("\n") : [text];
for(const line of lines) for(const line of lines)
...@@ -29,9 +31,10 @@ export function addInputHandler(handler, splitOnNewline = true) { ...@@ -29,9 +31,10 @@ export function addInputHandler(handler, splitOnNewline = true) {
window.addEventListener("keydown", keydown); window.addEventListener("keydown", keydown);
window.addEventListener("paste", paste); window.addEventListener("paste", paste);
functions.set(handler, {keydown, paste}); functions.set(handler, {keydown, paste});
return () => removeInputHandler(handler);
} }
export function removeInputHandler(handler) { export function removeInputHandler(handler: InputHandler) {
if(!browser) return; if(!browser) return;
const funcs = functions.get(handler); const funcs = functions.get(handler);
if(funcs) { if(funcs) {
......
import { writable } from "svelte/store"; import { writable, type Writable } from "svelte/store";
import { browser } from "$app/environment"; import { browser } from "$app/environment";
let currMsgId; type MessageType = "info" | "warning" | "error" | "success" | "default";
let messages; export type Message = {
function loadMessageStore(){ type: MessageType,
message: string,
id: number,
duration?: number
};
let currMsgId: number;
let messages: Message[];
function loadMessageStore(): Writable<Message[]>{
if(browser){ if(browser){
const data = localStorage.getItem("messages") || "[]"; const data = localStorage.getItem("messages") || "[]";
messages = JSON.parse(data); messages = JSON.parse(data);
currMsgId = messages.map(msg=>msg.id).reduce((max, id)=>Math.max(max, id), 0); currMsgId = messages.map(msg=>msg.id).reduce((max, id)=>Math.max(max, id), 0);
const store = new writable(messages); const store = writable(messages);
store.subscribe(msgs=>{ store.subscribe(msgs=>{
messages = msgs; messages = msgs;
localStorage.setItem("messages", JSON.stringify(msgs)); localStorage.setItem("messages", JSON.stringify(msgs));
}); });
return store; return store;
} }
return new writable([]); return writable([]);
} }
export const messageStore = loadMessageStore(); export const messageStore = loadMessageStore();
export function addMessage(type, message){ export function addMessage(type: MessageType, message: string, duration?: number){
if(browser) messageStore.update(messages => [...messages, {type, message, id: ++currMsgId}]); if(browser){
const msg = {type, message, id: ++currMsgId, duration};
messageStore.update(messages => [...messages, msg]);
return msg;
}
} }
export function removeMessage(message){ export function removeMessage(message: Message){
if(browser) messageStore.update(messages => messages.filter(m => m.id !== message.id)); if(browser) messageStore.update(messages => messages.filter(m => m.id !== message.id));
} }
export function getCurrentMessages(){ export function getCurrentMessages(){
...@@ -29,10 +41,10 @@ export function getCurrentMessages(){ ...@@ -29,10 +41,10 @@ export function getCurrentMessages(){
} }
export const MessageType = { export const MessageType = {
INFO: "info", INFO: "info" as MessageType,
WARN: "warning", WARN: "warning" as MessageType,
WARNING: "warning", WARNING: "warning" as MessageType,
ERROR: "error", ERROR: "error" as MessageType,
SUCCESS: "success", SUCCESS: "success" as MessageType,
DEFAULT: "default" DEFAULT: "default" as MessageType
}; };
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
const sessions = new Map(); const sessions: Map<string, string> = new Map();
function generate() { function generate(): string {
let token; let token: string;
do { do {
token = nanoid(32); token = nanoid(32);
} while (sessions.has(token)); } while (sessions.has(token));
return token; return token;
} }
function getTokenForCard(card) { function getTokenForCard(card: string): string|undefined {
for (const [token, c] of sessions) { for (const [token, c] of sessions) {
if (c === card) return token; if (c === card) return token;
} }
} }
export function generateSessionToken(card) { export function generateSessionToken(card: string): string {
const token = getTokenForCard(card) ?? generate(); const token = getTokenForCard(card) ?? generate();
sessions.set(token, card); sessions.set(token, card);
return token; return token;
} }
export function getCardFromSessionToken(sessionToken) { export function getCardFromSessionToken(sessionToken: string): string {
return sessions.get(sessionToken); return sessions.get(sessionToken);
} }
export function invalidateSessionToken(sessionToken) { export function invalidateSessionToken(sessionToken: string) {
sessions.delete(sessionToken); sessions.delete(sessionToken);
} }
import prisma from "@prisma/client"; import prisma, { PrismaClient } from "@prisma/client";
import { Codes } from "$lib/customcodes"; import { Codes } from "$lib/customcodes";
import { building } from "$app/environment"; import { building } from "$app/environment";
...@@ -11,7 +11,7 @@ function getDatabase(){ ...@@ -11,7 +11,7 @@ function getDatabase(){
return db; return db;
} }
async function initDatabase(db){ async function initDatabase(db: PrismaClient){
// While building the database is not needed and probably not even available // While building the database is not needed and probably not even available
if(building) return; if(building) return;
......
import { db } from "$lib/server/database"; import { db } from "$lib/server/database";
export function getPriceModifier(userBalance, noPremium=false){ export function getPriceModifier(userBalance: number, noPremium: boolean = false){
if(noPremium===true) return ()=>0; if(noPremium===true) return ()=>0;
if (userBalance < 0) { if (userBalance < 0) {
const debt = -userBalance; const debt = -userBalance;
const premium = 200 / (1 + Math.pow(Math.E, ((-debt + 2900) / 1000))); const premium = 200 / (1 + Math.pow(Math.E, ((-debt + 2900) / 1000)));
return originalPrice=>{ return (originalPrice: number)=>{
if(originalPrice < 0) { if(originalPrice < 0) {
// just in case that some article should have a negative price (e.g. for refunds) // just in case that some article should have a negative price (e.g. for refunds)
return 0; return 0;
...@@ -18,7 +18,7 @@ export function getPriceModifier(userBalance, noPremium=false){ ...@@ -18,7 +18,7 @@ export function getPriceModifier(userBalance, noPremium=false){
} }
}; };
}else{ }else{
return originalPrice=>{ return (originalPrice: number)=>{
if (userBalance < originalPrice) { if (userBalance < originalPrice) {
// 10%, aber maximal 0,10€ Aufschlag // 10%, aber maximal 0,10€ Aufschlag
return Math.min(10, Math.ceil(0.1 * originalPrice)); return Math.min(10, Math.ceil(0.1 * originalPrice));
...@@ -29,7 +29,7 @@ export function getPriceModifier(userBalance, noPremium=false){ ...@@ -29,7 +29,7 @@ export function getPriceModifier(userBalance, noPremium=false){
} }
} }
export function restockArticle(code, amount, cost){ export function restockArticle(code: string, amount: number, cost: number){
return db.item.update({ return db.item.update({
where: {code}, where: {code},
data: { data: {
...@@ -43,27 +43,27 @@ export function restockArticle(code, amount, cost){ ...@@ -43,27 +43,27 @@ export function restockArticle(code, amount, cost){
}); });
} }
export async function restockArticles(restocks){ export async function restockArticles(restocks: {code: string, amount: number, cost: number}[]){
return db.$transaction(restocks.map(({code, amount, cost})=>restockArticle(code, amount, cost))); return db.$transaction(restocks.map(({code, amount, cost})=>restockArticle(code, amount, cost)));
} }
export async function createArticle(code, name, price, categoryId, image, available=true, show=true){ export async function createArticle(code: string, name: string, price: number, categoryId: number, image: string, available=true, show=true){
return db.item.create({data: {code, name, price, categoryId, image, available, show}}); return db.item.create({data: {code, name, price, categoryId, image, available, show}});
} }
export async function updateArticle(code, name, price, categoryId, image, available, show){ export async function updateArticle(code: string, name: string, price: number, categoryId: number, image: string, available: boolean, show: boolean){
return db.item.update({where: {code}, data: {name, price, categoryId, image, available, show}}); return db.item.update({where: {code}, data: {name, price, categoryId, image, available, show}});
} }
export async function createCategory(name, position){ export async function createCategory(name: string, position: number){
return db.itemCategory.create({data: {name, position}}); return db.itemCategory.create({data: {name, position}});
} }
export async function updateCategory(id, name, position){ export async function updateCategory(id: number, name: string, position: number){
return db.itemCategory.update({where: {id}, data: {name, position}}); return db.itemCategory.update({where: {id}, data: {name, position}});
} }
export async function deleteCategory(id){ export async function deleteCategory(id: number){
return db.itemCategory.delete({where: {id}}); return db.itemCategory.delete({where: {id}});
} }
......
File moved
...@@ -154,7 +154,42 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe ...@@ -154,7 +154,42 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe
/* /*
[limit]+1 items are fetched because then we can check if there are more items to fetch. [limit]+1 items are fetched because then we can check if there are more items to fetch.
*/ */
const moneyTransactions = (await getMoneyTransactions(userId, before.moneyTransactions, limit+1)).map(transaction => ({ type MoneyTransaction = {
type: "transaction",
name: "Aufladen" | "Auszahlung",
difference: number,
createdAt: Date,
verified: boolean,
id: number,
balance?: number
};
type ItemTransaction = {
type: "item",
name: string,
difference: number,
premium: number,
createdAt: Date,
image: string,
id: number,
balance?: number
};
type MoneyTransfer = {
type: "transfer",
name: string,
difference: number,
createdAt: Date,
id: number,
balance?: number
};
type VoucherUse = {
type: "voucher",
name: string,
difference: number,
createdAt: Date,
id: number,
balance?: number
};
const moneyTransactions: MoneyTransaction[] = (await getMoneyTransactions(userId, before.moneyTransactions, limit+1)).map(transaction => ({
type: "transaction", type: "transaction",
name: transaction.amount > 0 ? "Aufladen" : "Auszahlung", name: transaction.amount > 0 ? "Aufladen" : "Auszahlung",
difference: transaction.amount, difference: transaction.amount,
...@@ -162,7 +197,7 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe ...@@ -162,7 +197,7 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe
verified: !!transaction.verifiedById, verified: !!transaction.verifiedById,
id: transaction.id id: transaction.id
})); }));
const itemTransactions = (await getItemTransactions(userId, before.itemTransactions, limit+1)).map(transaction => ({ const itemTransactions: ItemTransaction[] = (await getItemTransactions(userId, before.itemTransactions, limit+1)).map(transaction => ({
type: "item", type: "item",
name: transaction.item.name, name: transaction.item.name,
difference: -(transaction.price + transaction.premium), difference: -(transaction.price + transaction.premium),
...@@ -171,14 +206,14 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe ...@@ -171,14 +206,14 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe
image: transaction.item.image, image: transaction.item.image,
id: transaction.id id: transaction.id
})); }));
const moneyTransfers = (await getMoneyTransfers(userId, before.moneyTransactions, limit+1)).map(transfer => ({ const moneyTransfers: MoneyTransfer[] = (await getMoneyTransfers(userId, before.moneyTransactions, limit+1)).map(transfer => ({
type: "transfer", type: "transfer",
name: transfer.fromId === userId ? `Gesendet an ${transfer.to.name}` : `Empfangen von ${transfer.from.name}`, name: transfer.fromId === userId ? `Gesendet an ${transfer.to.name}` : `Empfangen von ${transfer.from.name}`,
difference: transfer.fromId === userId ? -transfer.amount : transfer.amount, difference: transfer.fromId === userId ? -transfer.amount : transfer.amount,
createdAt: transfer.createdAt, createdAt: transfer.createdAt,
id: transfer.id id: transfer.id
})); }));
const voucherUses = (await getUsedVouchers(userId, before.voucherUses, limit+1)).map(voucher => ({ const voucherUses: VoucherUse[] = (await getUsedVouchers(userId, before.voucherUses, limit+1)).map(voucher => ({
type: "voucher", type: "voucher",
name: `Gutschein ${voucher.code} eingelöst`, name: `Gutschein ${voucher.code} eingelöst`,
difference: voucher.amount, difference: voucher.amount,
...@@ -186,7 +221,7 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe ...@@ -186,7 +221,7 @@ export async function fetchTransactions(userId: number, balanceAfterwards: numbe
id: voucher.id id: voucher.id
})); }));
let transactions = [...moneyTransactions, ...itemTransactions, ...moneyTransfers, ...voucherUses] let transactions = [...moneyTransactions, ...itemTransactions, ...moneyTransfers, ...voucherUses]
.sort((a, b) => b.createdAt - a.createdAt); .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
const hasMore = transactions.length > limit; const hasMore = transactions.length > limit;
if(transactions.length > limit) transactions = transactions.filter((_,i)=>i<limit); if(transactions.length > limit) transactions = transactions.filter((_,i)=>i<limit);
if (transactions.length > 0) { if (transactions.length > 0) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment