Skip to content

Commit

Permalink
add db
Browse files Browse the repository at this point in the history
  • Loading branch information
labintsev committed Dec 8, 2024
1 parent 6c0c4d8 commit faee73e
Show file tree
Hide file tree
Showing 6 changed files with 520 additions and 1 deletion.
219 changes: 219 additions & 0 deletions packages/nextjs/app/seed/placeholder-data.ts
Original file line number Diff line number Diff line change
@@ -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 };
122 changes: 122 additions & 0 deletions packages/nextjs/app/seed/route.ts
Original file line number Diff line number Diff line change
@@ -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 });
}
}
37 changes: 37 additions & 0 deletions packages/nextjs/app/voting/_components/Voting.tsx
Original file line number Diff line number Diff line change
@@ -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 (
<div>
<h3>Vote on this post</h3>
<div>
<button className={"bg-secondary shadow-md m-4 p-4"} onClick={handleUpvote}>
Upvote
</button>
<button className={"bg-secondary shadow-md m-4 p-4"} onClick={handleDownvote}>
Downvote
</button>
</div>
<div>
<p>Current Vote Count: {voteCount}</p>
</div>
</div>
);
};

export default Voting;
4 changes: 3 additions & 1 deletion packages/nextjs/app/voting/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import Voting from "./_components/Voting";

export default function Page() {
return (
<>
<h1>Voting Page</h1>
<Voting />
</>
);
}
Loading

0 comments on commit faee73e

Please sign in to comment.