Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
992aaf5
created tickets.sql and basic ticket schema, access policies still ne…
neeleshseerapu Nov 21, 2025
c9b6e20
donations sql table
katieyungchung Nov 25, 2025
11a10a2
add rls policies
katieyungchung Nov 25, 2025
5fc8071
Created inventory_items table, migration file, and inventory_item type
Camillalalala Nov 25, 2025
2d72b04
Didn't finish server actions
oceeoun Nov 25, 2025
811a3e9
Finished Schema, began server actions
neeleshseerapu Nov 29, 2025
a1ee6b2
updates to store setup
minado05 Dec 2, 2025
31e6018
add server actions and test-donations page
katieyungchung Dec 2, 2025
a30d29e
deleted comment
katieyungchung Dec 2, 2025
a912ccc
Just need to test and add buttons of server actions
oceeoun Dec 2, 2025
80a12a2
ws 5
Oceanspray21 Dec 2, 2025
21949b9
ticket item db setup and actions
cheyennelu17 Dec 3, 2025
c080fea
Define DonationInsert type
joy-y-cheng Dec 5, 2025
b029c09
Merge branch 'main' into donation-setup
joy-y-cheng Dec 5, 2025
21e9336
updated store setup
minado05 Dec 5, 2025
c603eec
Refactor testing
joy-y-cheng Dec 5, 2025
b23f0bd
updated store setup
minado05 Dec 5, 2025
69fb357
Merge pull request #1 from lablueprint/donation-setup
katieyungchung Dec 5, 2025
0c12c31
Successfully implemented createItem() button
Camillalalala Dec 5, 2025
f9a57bc
Merge branch 'main' into ticket-item-setup
joy-y-cheng Dec 5, 2025
1b32597
Successfully implemented button to update inventory item quantity
Camillalalala Dec 5, 2025
ade046a
Successfully implemented button to delete inventory item
Camillalalala Dec 5, 2025
fd0b81e
Updated migration file to remove category field and update subcategor…
Camillalalala Dec 5, 2025
a7d1f32
Add primary key, minor fixes
joy-y-cheng Dec 5, 2025
603748e
Merge branch 'main' into store-setup
joy-y-cheng Dec 5, 2025
c44561f
Migrated test inventory item server actions to separate page
Camillalalala Dec 5, 2025
2427d5b
Move files
joy-y-cheng Dec 5, 2025
295dbcf
Add StoreInsert type
joy-y-cheng Dec 5, 2025
6af2b00
sprint 1
Oceanspray21 Dec 5, 2025
e74483d
Merge pull request #3 from lablueprint/store-setup
minado05 Dec 5, 2025
54e1825
Merge branch 'main' into ticket-setup
neeleshseerapu Dec 5, 2025
bc13b1e
Merge branch 'main' into ticket-setup # attempt 2
neeleshseerapu Dec 5, 2025
b9b16c0
added the example seed back
neeleshseerapu Dec 5, 2025
4775110
fixed small type checking inconsistency
neeleshseerapu Dec 5, 2025
3c12bd5
Fix Next.js security vulnerabilities
joy-y-cheng Dec 8, 2025
3d4424b
Update Next.js
joy-y-cheng Dec 15, 2025
36fd68e
Add Prettier
joy-y-cheng Dec 15, 2025
4fcdf49
Add Prettier for SQL
joy-y-cheng Dec 15, 2025
2f63301
Apply Prettier
joy-y-cheng Dec 16, 2025
b9d1008
Apply Prettier and refactor code
joy-y-cheng Dec 17, 2025
3beec20
Rename type files
joy-y-cheng Dec 17, 2025
b070657
Merge remote-tracking branch 'origin/main' into ticket-item-setup
joy-y-cheng Dec 17, 2025
5c2a078
Add TicketItemsTestComponent and apply Prettier
joy-y-cheng Dec 17, 2025
4791ff6
Merge pull request #2 from lablueprint/ticket-item-setup
joy-y-cheng Dec 17, 2025
bcc8671
Update GitHub Actions workflow
joy-y-cheng Dec 17, 2025
86724da
Rename type file
joy-y-cheng Dec 17, 2025
4688b67
Merge remote-tracking branch 'origin/main' into inventory-item-setup
joy-y-cheng Dec 17, 2025
af7bfa2
Refactor code into InventoryItemsTestComponent and apply Prettier
joy-y-cheng Dec 17, 2025
81a3bfe
Merge pull request #4 from lablueprint/inventory-item-setup
joy-y-cheng Dec 17, 2025
3f3324b
Merge remote-tracking branch 'origin/main' into ticket-setup
joy-y-cheng Dec 17, 2025
2fa9eb2
Refactor code into TicketsTestComponent and apply Prettier
joy-y-cheng Dec 17, 2025
8b9a9eb
Merge pull request #5 from lablueprint/ticket-setup
joy-y-cheng Dec 18, 2025
548dfe5
Make return behavior of Server Actions consistent
joy-y-cheng Dec 18, 2025
1b3d3d5
Minor fixes to tables and types
joy-y-cheng Dec 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Release (Production)
name: Update Remote Database

on:
push:
Expand All @@ -21,4 +21,4 @@ jobs:
version: latest

- run: supabase link --project-ref $SUPABASE_PROJECT_ID
- run: supabase db push
- run: supabase db push --include-all
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
supabase/migrations
21 changes: 21 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"semi": true,
"trailingComma": "all",
"singleQuote": true,
"printWidth": 80,
"tabWidth": 2,
"useTabs": false,
"jsxSingleQuote": false,
"arrowParens": "always",
"plugins": ["prettier-plugin-sql"],
"overrides": [
{
"files": "*.sql",
"options": {
"language": "postgresql",
"keywordCase": "lower",
"dataTypeCase": "lower"
}
}
]
}
4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true
}
25 changes: 0 additions & 25 deletions app/(pages)/example/page.tsx

This file was deleted.

23 changes: 23 additions & 0 deletions app/(pages)/test/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
'use client';

import ExampleTestComponent from '@/app/components/test/ExampleTestComponent';
import DonationsTestComponent from '@/app/components/test/DonationsTestComponent';
import StoresTestComponent from '@/app/components/test/StoresTestComponent';
import InventoryItemsTestComponent from '@/app/components/test/InventoryItemsTestComponent';
import TicketsTestComponent from '@/app/components/test/TicketsTestComponent';
import TicketItemsTestComponent from '@/app/components/test/TicketItemsTestComponent';

export default function TestPage() {
return (
<div>
Welcome to PATH! This is a test page.
<br />
<ExampleTestComponent />
<DonationsTestComponent />
<StoresTestComponent />
<InventoryItemsTestComponent />
<TicketsTestComponent />
<TicketItemsTestComponent />
</div>
);
}
36 changes: 36 additions & 0 deletions app/api/donations/actions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
'use server';

import { DonationInsert } from '@/app/types/donation';
import { createClient } from '@/app/lib/supabase/server-client';

export async function createDonation(data: DonationInsert) {
const supabase = await createClient();

const { data: entry, error: err } = await supabase
.from('donations')
.insert(data)
.select() // after inserting, return full new row
.single(); // expect just one row, if more or less, throw an error

if (err) {
console.error('Error creating donation:', err);
return { success: false, error: err };
}
return { success: true, data: entry }; // return the row that was created
}

// deletes donation based on donation_id
export async function deleteDonation(donationId: string) {
const supabase = await createClient();

const { error: err } = await supabase
.from('donations')
.delete()
.eq('donation_id', donationId);

if (err) {
console.error('Error deleting donation:', err);
return { success: false, error: err };
}
return { success: true };
}
23 changes: 14 additions & 9 deletions app/api/example/actions.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
"use server";
'use server';

import { ExampleType } from "@/app/types/ExampleType";
import { createClient } from "@/app/lib/supabase/server-client";
import { Example } from '@/app/types/example';
import { createClient } from '@/app/lib/supabase/server-client';

export const createExampleEntry = async (data: ExampleType) => {
export const createExampleEntry = async (data: Example) => {
const supabase = await createClient();
const { data: entry, error } = await supabase.from("example").insert(data);
const { data: entry, error: err } = await supabase
.from('example')
.insert(data)
.select()
.single();

if (error) {
throw error;
if (err) {
console.error('Error creating example:', err);
return { success: false, error: err };
}
return entry;
}
return { success: true, data: entry };
};
50 changes: 50 additions & 0 deletions app/api/inventory-items/actions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
'use server';

import { InventoryItemInsert } from '@/app/types/inventory';
import { createClient } from '@/app/lib/supabase/server-client';

export const createItem = async (data: InventoryItemInsert) => {
const supabase = await createClient();
const { data: entry, error: err } = await supabase
.from('inventory_items')
.insert(data)
.select()
.single();

if (err) {
console.error('Error creating inventory item:', err);
return { success: false, error: err };
}
return { success: true, data: entry };
};

export const changeItemQuantity = async (
inventoryItemId: string,
newQuantity: number,
) => {
const supabase = await createClient();
const { error: err } = await supabase
.from('inventory_items')
.update({ quantity_available: newQuantity })
.eq('inventory_item_id', inventoryItemId);

if (err) {
console.error('Error changing inventory item quantity:', err);
return { success: false, error: err };
}
return { success: true };
};

export const deleteItem = async (inventoryItemId: string) => {
const supabase = await createClient();
const { error: err } = await supabase
.from('inventory_items')
.delete()
.eq('inventory_item_id', inventoryItemId);

if (err) {
console.error('Error deleting inventory item:', err);
return { success: false, error: err };
}
return { success: true };
};
35 changes: 35 additions & 0 deletions app/api/stores/actions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
'use server';

import { createClient } from '@/app/lib/supabase/server-client';
import { StoreInsert } from '@/app/types/store';

// create store
export const createStore = async (data: StoreInsert) => {
const supabase = await createClient();
const { data: entry, error: err } = await supabase
.from('stores')
.insert(data)
.select()
.single();

if (err) {
console.error('Error creating store:', err);
return { success: false, error: err };
}
return { success: true, data: entry };
};

// delete store given store_id
export const deleteStore = async (storeId: string) => {
const supabase = await createClient();
const { error: err } = await supabase
.from('stores')
.delete()
.eq('store_id', storeId);

if (err) {
console.error('Error deleting store:', err);
return { success: false, error: err };
}
return { success: true };
};
68 changes: 68 additions & 0 deletions app/api/ticket-items/actions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
'use server';

import { TicketItemInsert } from '@/app/types/ticket';
import { createClient } from '@/app/lib/supabase/server-client';

export async function createTicketItem(data: TicketItemInsert) {
const supabase = await createClient();
// Server Action uses a mutation method
const { data: entry, error: err } = await supabase
.from('ticket_items')
.insert(data)
.select()
.single();

if (err) {
console.error('Error creating ticket item:', err);
return { success: false, error: err };
}
return { success: true, data: entry };
}

export async function changeTicketItemQuantity(
ticketItemId: string,
newQuantity: number,
) {
const supabase = await createClient();
const { error: err } = await supabase
.from('ticket_items')
.update({ quantity_requested: newQuantity })
.eq('ticket_item_id', ticketItemId);

if (err) {
console.error('Error changing ticket item quantity:', err);
return { success: false, error: err };
}
return { success: true };
}

export async function changeTicketItemDescription(
ticketItemId: string,
newDescription: string,
) {
const supabase = await createClient();
const { error: err } = await supabase
.from('ticket_items')
.update({ free_text_description: newDescription })
.eq('ticket_item_id', ticketItemId);

if (err) {
console.error('Error changing ticket item description:', err);
return { success: false, error: err };
}
return { success: true };
}

export async function deleteTicketItem(ticketItemId: string) {
const supabase = await createClient();
const { error: err } = await supabase
.from('ticket_items')
.delete()
.eq('ticket_item_id', ticketItemId);

if (err) {
console.error('Error deleting ticket item:', err);
return { success: false, error: err };
}
return { success: true };
}
48 changes: 48 additions & 0 deletions app/api/tickets/actions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
'use server'; // directive that indicates that the functions we define are server actions

import { TicketInsert } from '@/app/types/ticket';
import { createClient } from '@/app/lib/supabase/server-client';

export async function createTicket(data: TicketInsert) {
const supabase = await createClient();
// pulling out the error from the insert into tickets table
const { data: entry, error: err } = await supabase
.from('tickets')
.insert(data)
.select()
.single();

if (err) {
console.error('Error creating ticket:', err);
return { success: false, error: err };
}
return { success: true, data: entry };
}

export async function deleteTicket(ticketId: string) {
const supabase = await createClient();
const { error: err } = await supabase
.from('tickets')
.delete()
.eq('ticket_id', ticketId);

if (err) {
console.error('Error deleting ticket:', err);
return { success: false, error: err };
}
return { success: true };
}

export async function updateTicketStatus(newStatus: string, ticketId: string) {
const supabase = await createClient();
const { error: err } = await supabase
.from('tickets')
.update({ status: newStatus })
.eq('ticket_id', ticketId);

if (err) {
console.error('Error changing ticket status:', err);
return { success: false, error: err };
}
return { success: true };
}
Loading