diff --git a/packages/nextjs/app/seed/placeholder-data.ts b/packages/nextjs/app/seed/placeholder-data.ts new file mode 100644 index 0000000..4f52d6a --- /dev/null +++ b/packages/nextjs/app/seed/placeholder-data.ts @@ -0,0 +1,219 @@ +// const shareholders = [ +// { +// id: '410544b2-4001-4271-9855-fec4b6a6442a', +// name: 'User', +// email: 'user@nextmail.com', +// password: '123456', +// }, +// ]; + +// const questions = [ +// { +// id: 0, +// question: 'Do you enjoy this voting application?', +// is_active: 1 +// }, +// { +// id: 1, +// question: 'Who will be Chief Executive Officer in 2025?', +// is_active: 1 +// }, +// { +// id: 2, +// question: 'Do you approve the financial report?', +// is_active: 1 +// } +// ] + +// const question_choices = [ +// { +// id: 0, +// question_id: questions[0].id, +// choice: 'Yes' +// }, +// { +// id: 1, +// question_id: questions[0].id, +// choice: 'No' +// }, +// { +// id: 2, +// question_id: questions[1].id, +// choice: 'Donald Duck' +// }, +// { +// id: 3, +// question_id: questions[1].id, +// choice: 'John Smith' +// }, +// { +// id: 4, +// question_id: questions[1].id, +// choice: 'Billy Bones' +// }, +// { +// id: 5, +// question_id: questions[2].id, +// choice: 'Yes' +// }, +// { +// id: 6, +// question_id: questions[2].id, +// choice: 'No' +// }, +// ] + +// const shareholder_question_answers = [ +// { +// sh_id: shareholders[0].id, +// q_id: question_choices[0].id, +// chice_id: question_choices[0].id, +// answer_time: '2024-12-8' +// } +// ] + +const users = [ + { + id: "410544b2-4001-4271-9855-fec4b6a6442a", + name: "User", + email: "user@nextmail.com", + password: "123456", + }, +]; + +const customers = [ + { + id: "d6e15727-9fe1-4961-8c5b-ea44a9bd81aa", + name: "Evil Rabbit", + email: "evil@rabbit.com", + image_url: "/customers/evil-rabbit.png", + }, + { + id: "3958dc9e-712f-4377-85e9-fec4b6a6442a", + name: "Delba de Oliveira", + email: "delba@oliveira.com", + image_url: "/customers/delba-de-oliveira.png", + }, + { + id: "3958dc9e-742f-4377-85e9-fec4b6a6442a", + name: "Lee Robinson", + email: "lee@robinson.com", + image_url: "/customers/lee-robinson.png", + }, + { + id: "76d65c26-f784-44a2-ac19-586678f7c2f2", + name: "Michael Novotny", + email: "michael@novotny.com", + image_url: "/customers/michael-novotny.png", + }, + { + id: "CC27C14A-0ACF-4F4A-A6C9-D45682C144B9", + name: "Amy Burns", + email: "amy@burns.com", + image_url: "/customers/amy-burns.png", + }, + { + id: "13D07535-C59E-4157-A011-F8D2EF4E0CBB", + name: "Balazs Orban", + email: "balazs@orban.com", + image_url: "/customers/balazs-orban.png", + }, +]; + +const invoices = [ + { + customer_id: customers[0].id, + amount: 15795, + status: "pending", + date: "2022-12-06", + }, + { + customer_id: customers[1].id, + amount: 20348, + status: "pending", + date: "2022-11-14", + }, + { + customer_id: customers[4].id, + amount: 3040, + status: "paid", + date: "2022-10-29", + }, + { + customer_id: customers[3].id, + amount: 44800, + status: "paid", + date: "2023-09-10", + }, + { + customer_id: customers[5].id, + amount: 34577, + status: "pending", + date: "2023-08-05", + }, + { + customer_id: customers[2].id, + amount: 54246, + status: "pending", + date: "2023-07-16", + }, + { + customer_id: customers[0].id, + amount: 666, + status: "pending", + date: "2023-06-27", + }, + { + customer_id: customers[3].id, + amount: 32545, + status: "paid", + date: "2023-06-09", + }, + { + customer_id: customers[4].id, + amount: 1250, + status: "paid", + date: "2023-06-17", + }, + { + customer_id: customers[5].id, + amount: 8546, + status: "paid", + date: "2023-06-07", + }, + { + customer_id: customers[1].id, + amount: 500, + status: "paid", + date: "2023-08-19", + }, + { + customer_id: customers[5].id, + amount: 8945, + status: "paid", + date: "2023-06-03", + }, + { + customer_id: customers[2].id, + amount: 1000, + status: "paid", + date: "2022-06-05", + }, +]; + +const revenue = [ + { month: "Jan", revenue: 2000 }, + { month: "Feb", revenue: 1800 }, + { month: "Mar", revenue: 2200 }, + { month: "Apr", revenue: 2500 }, + { month: "May", revenue: 2300 }, + { month: "Jun", revenue: 3200 }, + { month: "Jul", revenue: 3500 }, + { month: "Aug", revenue: 3700 }, + { month: "Sep", revenue: 2500 }, + { month: "Oct", revenue: 2800 }, + { month: "Nov", revenue: 3000 }, + { month: "Dec", revenue: 4800 }, +]; + +export { users, customers, invoices, revenue }; diff --git a/packages/nextjs/app/seed/route.ts b/packages/nextjs/app/seed/route.ts new file mode 100644 index 0000000..35a1629 --- /dev/null +++ b/packages/nextjs/app/seed/route.ts @@ -0,0 +1,122 @@ +import { customers, invoices, revenue, users } from "./placeholder-data"; +import { db } from "@vercel/postgres"; +import bcrypt from "bcrypt"; + +const client = await db.connect(); + +async function seedUsers() { + await client.sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`; + await client.sql` + CREATE TABLE IF NOT EXISTS users ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email TEXT NOT NULL UNIQUE, + password TEXT NOT NULL + ); + `; + + const insertedUsers = await Promise.all( + users.map(async user => { + const hashedPassword = await bcrypt.hash(user.password, 10); + return client.sql` + INSERT INTO users (id, name, email, password) + VALUES (${user.id}, ${user.name}, ${user.email}, ${hashedPassword}) + ON CONFLICT (id) DO NOTHING; + `; + }), + ); + + return insertedUsers; +} + +async function seedInvoices() { + await client.sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`; + + await client.sql` + CREATE TABLE IF NOT EXISTS invoices ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + customer_id UUID NOT NULL, + amount INT NOT NULL, + status VARCHAR(255) NOT NULL, + date DATE NOT NULL + ); + `; + + const insertedInvoices = await Promise.all( + invoices.map( + invoice => client.sql` + INSERT INTO invoices (customer_id, amount, status, date) + VALUES (${invoice.customer_id}, ${invoice.amount}, ${invoice.status}, ${invoice.date}) + ON CONFLICT (id) DO NOTHING; + `, + ), + ); + + return insertedInvoices; +} + +async function seedCustomers() { + await client.sql`CREATE EXTENSION IF NOT EXISTS "uuid-ossp"`; + + await client.sql` + CREATE TABLE IF NOT EXISTS customers ( + id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + image_url VARCHAR(255) NOT NULL + ); + `; + + const insertedCustomers = await Promise.all( + customers.map( + customer => client.sql` + INSERT INTO customers (id, name, email, image_url) + VALUES (${customer.id}, ${customer.name}, ${customer.email}, ${customer.image_url}) + ON CONFLICT (id) DO NOTHING; + `, + ), + ); + + return insertedCustomers; +} + +async function seedRevenue() { + await client.sql` + CREATE TABLE IF NOT EXISTS revenue ( + month VARCHAR(4) NOT NULL UNIQUE, + revenue INT NOT NULL + ); + `; + + const insertedRevenue = await Promise.all( + revenue.map( + rev => client.sql` + INSERT INTO revenue (month, revenue) + VALUES (${rev.month}, ${rev.revenue}) + ON CONFLICT (month) DO NOTHING; + `, + ), + ); + + return insertedRevenue; +} + +export async function GET() { + // return Response.json({ + // message: + // 'Uncomment this file and remove this line. You can delete this file when you are finished.', + // }); + try { + await client.sql`BEGIN`; + await seedUsers(); + await seedCustomers(); + await seedInvoices(); + await seedRevenue(); + await client.sql`COMMIT`; + + return Response.json({ message: "Database seeded successfully" }); + } catch (error) { + await client.sql`ROLLBACK`; + return Response.json({ error }, { status: 500 }); + } +} diff --git a/packages/nextjs/app/voting/_components/Voting.tsx b/packages/nextjs/app/voting/_components/Voting.tsx new file mode 100644 index 0000000..a5d3759 --- /dev/null +++ b/packages/nextjs/app/voting/_components/Voting.tsx @@ -0,0 +1,37 @@ +"use client"; + +import React, { useState } from "react"; + +const Voting = () => { + // Initialize state to keep track of vote counts + const [voteCount, setVoteCount] = useState(0); + + // Handler function to increment the vote count for upvote + const handleUpvote = () => { + setVoteCount(voteCount + 1); + }; + + // Handler function to decrement the vote count for downvote + const handleDownvote = () => { + setVoteCount(voteCount - 1); + }; + + return ( +
Current Vote Count: {voteCount}
+