Skip to content

Commit

Permalink
Merge branch 'main' into devex-makefile-tool
Browse files Browse the repository at this point in the history
  • Loading branch information
IldenH committed Jan 10, 2025
2 parents 0173af3 + f9edcd0 commit 0adcbf2
Show file tree
Hide file tree
Showing 17 changed files with 139 additions and 166 deletions.
4 changes: 2 additions & 2 deletions src/lib/components/AuthButton.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
}
async function login() {
const authData = await pb.collection("users").authWithOAuth2({ provider: "google" });
const authData = await pb.collection("user").authWithOAuth2({ provider: "google" });
const meta = authData.meta;
Expand All @@ -32,7 +32,7 @@
formData.append("avatar", avatar);
}
await pb.collection("users").update(authData.record.id, formData);
await pb.collection("user").update(authData.record.id, formData);
}
document.cookie = pb.authStore.exportToCookie({ httpOnly: false });
Expand Down
154 changes: 60 additions & 94 deletions src/lib/pocketbase/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ export enum Collections {
Mfas = "_mfas",
Otps = "_otps",
Superusers = "_superusers",
ActiveMessage = "activeMessage",
Categories = "categories",
DisplayMessages = "displayMessages",
Drinks = "drinks",
OrderDrink = "order_drink",
Orders = "orders",
Users = "users",
Category = "category",
Item = "item",
Message = "message",
Order = "order",
OrderItem = "order_item",
Status = "status",
User = "user",
}

// Alias types for improved usability
Expand Down Expand Up @@ -91,105 +91,71 @@ export type SuperusersRecord = {
verified?: boolean
}

export type ActiveMessageRecord = {
export type CategoryRecord = {
created?: IsoDateString
id: string
isVisible?: boolean
message?: RecordIdString
name: string
sort_order: number
updated?: IsoDateString
}

export type CategoriesRecord = {
export type ItemRecord = {
category: RecordIdString
created?: IsoDateString
id: string
image: string
name: string
sort_order: number
price_nok: number
updated?: IsoDateString
}

export type DisplayMessagesRecord = {
export type MessageRecord = {
created?: IsoDateString
id: string
subtext?: string
subtitle?: string
title?: string
updated?: IsoDateString
}

export type DrinksRecord = {
category: RecordIdString
export enum OrderStateOptions {
"received" = "received",
"production" = "production",
"completed" = "completed",
"dispatched" = "dispatched",
}
export type OrderRecord = {
created?: IsoDateString
customer?: RecordIdString
id: string
image: string
name: string
price: number
items: RecordIdString[]
state?: OrderStateOptions
updated?: IsoDateString
}

export enum OrderDrinkServingSizeOptions {
"small" = "small",
"big" = "big",
"custom" = "custom",
}

export enum OrderDrinkMilkOptions {
"oat" = "oat",
"soy" = "soy",
"whole" = "whole",
"low-fat" = "low-fat",
"lactose-free" = "lactose-free",
}

export enum OrderDrinkExtrasOptions {
"sirup" = "sirup",
"espresso" = "espresso",
"cream" = "cream",
}

export enum OrderDrinkFlavorOptions {
"vanilla" = "vanilla",
"salt-caramel" = "salt-caramel",
"pumpkin-spice" = "pumpkin-spice",
"irish" = "irish",
"spicy" = "spicy",
}
export type OrderDrinkRecord = {
export type OrderItemRecord = {
created?: IsoDateString
drink: RecordIdString
extras?: OrderDrinkExtrasOptions[]
flavor?: OrderDrinkFlavorOptions[]
id: string
milk?: OrderDrinkMilkOptions
serving_size?: OrderDrinkServingSizeOptions
item: RecordIdString
updated?: IsoDateString
}

export enum OrdersStateOptions {
"received" = "received",
"production" = "production",
"completed" = "completed",
"dispatched" = "dispatched",
}
export type OrdersRecord = {
export type StatusRecord = {
created?: IsoDateString
customer?: RecordIdString
drinks: RecordIdString[]
id: string
payment_fulfilled?: boolean
state?: OrdersStateOptions
message?: RecordIdString
online?: boolean
updated?: IsoDateString
}

export type UsersRecord = {
export type UserRecord = {
avatar?: string
created?: IsoDateString
email?: string
emailVisibility?: boolean
favorites?: RecordIdString[]
id: string
is_admin?: boolean
name?: string
password: string
purchased_cup?: boolean
tokenKey: string
updated?: IsoDateString
username: string
Expand All @@ -202,13 +168,13 @@ export type ExternalauthsResponse<Texpand = unknown> = Required<ExternalauthsRec
export type MfasResponse<Texpand = unknown> = Required<MfasRecord> & BaseSystemFields<Texpand>
export type OtpsResponse<Texpand = unknown> = Required<OtpsRecord> & BaseSystemFields<Texpand>
export type SuperusersResponse<Texpand = unknown> = Required<SuperusersRecord> & AuthSystemFields<Texpand>
export type ActiveMessageResponse<Texpand = unknown> = Required<ActiveMessageRecord> & BaseSystemFields<Texpand>
export type CategoriesResponse<Texpand = unknown> = Required<CategoriesRecord> & BaseSystemFields<Texpand>
export type DisplayMessagesResponse<Texpand = unknown> = Required<DisplayMessagesRecord> & BaseSystemFields<Texpand>
export type DrinksResponse<Texpand = unknown> = Required<DrinksRecord> & BaseSystemFields<Texpand>
export type OrderDrinkResponse<Texpand = unknown> = Required<OrderDrinkRecord> & BaseSystemFields<Texpand>
export type OrdersResponse<Texpand = unknown> = Required<OrdersRecord> & BaseSystemFields<Texpand>
export type UsersResponse<Texpand = unknown> = Required<UsersRecord> & AuthSystemFields<Texpand>
export type CategoryResponse<Texpand = unknown> = Required<CategoryRecord> & BaseSystemFields<Texpand>
export type ItemResponse<Texpand = unknown> = Required<ItemRecord> & BaseSystemFields<Texpand>
export type MessageResponse<Texpand = unknown> = Required<MessageRecord> & BaseSystemFields<Texpand>
export type OrderResponse<Texpand = unknown> = Required<OrderRecord> & BaseSystemFields<Texpand>
export type OrderItemResponse<Texpand = unknown> = Required<OrderItemRecord> & BaseSystemFields<Texpand>
export type StatusResponse<Texpand = unknown> = Required<StatusRecord> & BaseSystemFields<Texpand>
export type UserResponse<Texpand = unknown> = Required<UserRecord> & AuthSystemFields<Texpand>

// Types containing all Records and Responses, useful for creating typing helper functions

Expand All @@ -218,13 +184,13 @@ export type CollectionRecords = {
_mfas: MfasRecord
_otps: OtpsRecord
_superusers: SuperusersRecord
activeMessage: ActiveMessageRecord
categories: CategoriesRecord
displayMessages: DisplayMessagesRecord
drinks: DrinksRecord
order_drink: OrderDrinkRecord
orders: OrdersRecord
users: UsersRecord
category: CategoryRecord
item: ItemRecord
message: MessageRecord
order: OrderRecord
order_item: OrderItemRecord
status: StatusRecord
user: UserRecord
}

export type CollectionResponses = {
Expand All @@ -233,13 +199,13 @@ export type CollectionResponses = {
_mfas: MfasResponse
_otps: OtpsResponse
_superusers: SuperusersResponse
activeMessage: ActiveMessageResponse
categories: CategoriesResponse
displayMessages: DisplayMessagesResponse
drinks: DrinksResponse
order_drink: OrderDrinkResponse
orders: OrdersResponse
users: UsersResponse
category: CategoryResponse
item: ItemResponse
message: MessageResponse
order: OrderResponse
order_item: OrderItemResponse
status: StatusResponse
user: UserResponse
}

// Type for usage with type asserted PocketBase instance
Expand All @@ -251,11 +217,11 @@ export type TypedPocketBase = PocketBase & {
collection(idOrName: '_mfas'): RecordService<MfasResponse>
collection(idOrName: '_otps'): RecordService<OtpsResponse>
collection(idOrName: '_superusers'): RecordService<SuperusersResponse>
collection(idOrName: 'activeMessage'): RecordService<ActiveMessageResponse>
collection(idOrName: 'categories'): RecordService<CategoriesResponse>
collection(idOrName: 'displayMessages'): RecordService<DisplayMessagesResponse>
collection(idOrName: 'drinks'): RecordService<DrinksResponse>
collection(idOrName: 'order_drink'): RecordService<OrderDrinkResponse>
collection(idOrName: 'orders'): RecordService<OrdersResponse>
collection(idOrName: 'users'): RecordService<UsersResponse>
collection(idOrName: 'category'): RecordService<CategoryResponse>
collection(idOrName: 'item'): RecordService<ItemResponse>
collection(idOrName: 'message'): RecordService<MessageResponse>
collection(idOrName: 'order'): RecordService<OrderResponse>
collection(idOrName: 'order_item'): RecordService<OrderItemResponse>
collection(idOrName: 'status'): RecordService<StatusResponse>
collection(idOrName: 'user'): RecordService<UserResponse>
}
4 changes: 2 additions & 2 deletions src/lib/pocketbase/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import PocketBase from "pocketbase";
import { PUBLIC_PB_HOST } from "$env/static/public";
import { type TypedPocketBase, Collections, OrdersStateOptions } from "$lib/pocketbase/index.d";
import { type TypedPocketBase, Collections, OrderStateOptions } from "$lib/pocketbase/index.d";

const pb = new PocketBase(PUBLIC_PB_HOST) as TypedPocketBase;
pb.autoCancellation(false);

export default pb;
export { Collections, OrdersStateOptions };
export { Collections, OrderStateOptions };
export type * from "$lib/pocketbase/index.d";
6 changes: 3 additions & 3 deletions src/lib/stores/menuStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { createGenericPbStore } from "$stores/pbStore";
import { Collections } from "$lib/pocketbase";
import { Item, Category } from "$lib/types";

export const categories = createGenericPbStore(Collections.Categories, Category, {
export const categories = createGenericPbStore(Collections.Category, Category, {
sort: "sort_order",
expand: "drinks_via_category"
expand: "item_via_category"
});

export const items = createGenericPbStore(Collections.Drinks, Item);
export const items = createGenericPbStore(Collections.Item, Item);
10 changes: 5 additions & 5 deletions src/lib/stores/messageStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import eventsource from "eventsource";
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(global as any).EventSource = eventsource;

export const messages = createGenericPbStore(Collections.DisplayMessages, Message);
export const messages = createGenericPbStore(Collections.Message, Message);

function createActiveMessageStore() {
// Initialize with dummy non-visible message
Expand All @@ -18,7 +18,7 @@ function createActiveMessageStore() {
message: new Message({
id: "",
title: "",
subtext: ""
subtitle: ""
} as Message)
} as ActiveMessage)
);
Expand All @@ -30,12 +30,12 @@ function createActiveMessageStore() {
(async () => {
// Only use the first record. Assumes that PB already has this and only this record.
const initialData: ExpandedActiveMessageRecord = await pb
.collection(Collections.ActiveMessage)
.collection(Collections.Status)
.getFirstListItem("", baseOptions);

set(ActiveMessage.fromPb(initialData));

pb.collection(Collections.ActiveMessage).subscribe(
pb.collection(Collections.Status).subscribe(
"*",
(event: { record: ExpandedActiveMessageRecord }) => {
set(ActiveMessage.fromPb(event.record));
Expand All @@ -50,6 +50,6 @@ function createActiveMessageStore() {
export const activeMessage = {
subscribe: createActiveMessageStore(),
update: async (activeMessage: ActiveMessage) => {
await pb.collection(Collections.ActiveMessage).update(activeMessage.id, activeMessage.toPb());
await pb.collection(Collections.Status).update(activeMessage.id, activeMessage.toPb());
}
};
16 changes: 9 additions & 7 deletions src/lib/stores/orderStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,39 @@ import { get } from "svelte/store";
const today = new Date().toISOString().split("T")[0];

const baseOptions = {
expand: "drinks,drinks.drink",
// Table `item`
// + col `item` which references `order_item`
expand: "items,items.item",
filter: `created >= "${today}"`
};

export default {
subscribe: createPbStore(Collections.Orders, Order, baseOptions),
subscribe: createPbStore(Collections.Order, Order, baseOptions),

create: async (userId: RecordIdString, itemIds: RecordIdString[]) => {
const getOrderItemIds = async (): Promise<RecordIdString[]> => {
return await Promise.all(
itemIds.map(async (itemId) => {
const response = await pb.collection(Collections.OrderDrink).create({ drink: itemId });
const response = await pb.collection(Collections.OrderItem).create({ item: itemId });
return response.id;
})
);
};

await pb.collection(Collections.Orders).create({
await pb.collection(Collections.Order).create({
customer: userId,
drinks: await getOrderItemIds(),
items: await getOrderItemIds(),
state: State.received,
payment_fulfilled: false
});
},

updateState: (orderId: RecordIdString, state: State) => {
pb.collection(Collections.Orders).update(orderId, { state });
pb.collection(Collections.Order).update(orderId, { state });
}
};

export const userOrders = createGenericPbStore(Collections.Orders, Order, {
export const userOrders = createGenericPbStore(Collections.Order, Order, {
...baseOptions,
filter: `customer = '${get(auth).user.id}'`
});
Loading

0 comments on commit 0adcbf2

Please sign in to comment.