diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e36197 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Quiz app + api + +A simple music quiz app + +See `api` and `web` folders for more specific info. + +Requires bun.js for runtime and postgres, easiest way to set postgres up is to get Docker. diff --git a/api/README.md b/api/README.md index 0b45ea9..eafbfcd 100644 --- a/api/README.md +++ b/api/README.md @@ -1,4 +1,4 @@ -# web +# API To install dependencies: @@ -9,7 +9,32 @@ bun install To run: ```bash -bun run index.ts +bun run dev ``` -This project was created using `bun init` in bun v1.3.11. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. +Requires running Postgres and environment setup. + +Create `.env` file (in this folder): + +```sh +# Leave as is if using docker/default Postgres install +DATABASE_URL=postgres://postgres:postgres@localhost/postgres +BETTER_AUTH_URL=http://127.0.0.1:3000 + +# random secure secret; can be left as is for development/testing +BETTER_AUTH_SECRET=vGIwQFYm4kUPHOhFNt882IbFaWhLklke + +# Create a spotify web app. +# Add http://127.0.0.1:3000/api/auth/callback/spotify as callback URL there +# Copy and paste Client ID and Client secret to the following places: +SPOTIFY_CLIENT_ID= +SPOTIFY_CLIENT_SECRET= +``` + +Important files for editing: + +- `src/workflows/quiz.ts` has the main Quiz loop. + - Questions are generated in `src/party/` files. +- `src/workflows/sync.ts` gets data from spotify and saves into database +- `src/workflows/party-analysis.ts` generates analysis details of a given party, to be used for question generation +- `src/party-types.ts` contains type definitions of party data, shared with frontend diff --git a/web/README.md b/web/README.md index 2d17e0a..42fb75d 100644 --- a/web/README.md +++ b/web/README.md @@ -1,238 +1,20 @@ -Welcome to your new TanStack Start app! +# Web -# Getting Started +A Tanstack start React web app, using Shadcn components. -To run this application: - -```bash +Install dependencies: +```sh bun install -bun --bun run dev ``` -# Building For Production - -To build this application for production: - -```bash -bun --bun run build +Run locally: +```sh +bun run dev ``` -## Testing +By default connects to local backend (see `../api`) -This project uses [Vitest](https://vitest.dev/) for testing. You can run the tests with: +Important files to update: -```bash -bun --bun run test -``` - -## Styling - -This project uses [Tailwind CSS](https://tailwindcss.com/) for styling. - -### Removing Tailwind CSS - -If you prefer not to use Tailwind CSS: - -1. Remove the demo pages in `src/routes/demo/` -2. Replace the Tailwind import in `src/styles.css` with your own styles -3. Remove `tailwindcss()` from the plugins array in `vite.config.ts` -4. Uninstall the packages: `bun install @tailwindcss/vite tailwindcss -D` - -## Linting & Formatting - -This project uses [Biome](https://biomejs.dev/) for linting and formatting. The following scripts are available: - - -```bash -bun --bun run lint -bun --bun run format -bun --bun run check -``` - - -## Setting up Better Auth - -1. Generate and set the `BETTER_AUTH_SECRET` environment variable in your `.env.local`: - - ```bash - bunx --bun @better-auth/cli secret - ``` - -2. Visit the [Better Auth documentation](https://www.better-auth.com) to unlock the full potential of authentication in your app. - -### Adding a Database (Optional) - -Better Auth can work in stateless mode, but to persist user data, add a database: - -```typescript -// src/lib/auth.ts -import { betterAuth } from "better-auth"; -import { Pool } from "pg"; - -export const auth = betterAuth({ - database: new Pool({ - connectionString: process.env.DATABASE_URL, - }), - // ... rest of config -}); -``` - -Then run migrations: - -```bash -bunx --bun @better-auth/cli migrate -``` - - - -## Routing - -This project uses [TanStack Router](https://tanstack.com/router) with file-based routing. Routes are managed as files in `src/routes`. - -### Adding A Route - -To add a new route to your application just add a new file in the `./src/routes` directory. - -TanStack will automatically generate the content of the route file for you. - -Now that you have two routes you can use a `Link` component to navigate between them. - -### Adding Links - -To use SPA (Single Page Application) navigation you will need to import the `Link` component from `@tanstack/react-router`. - -```tsx -import { Link } from "@tanstack/react-router"; -``` - -Then anywhere in your JSX you can use it like so: - -```tsx -About -``` - -This will create a link that will navigate to the `/about` route. - -More information on the `Link` component can be found in the [Link documentation](https://tanstack.com/router/v1/docs/framework/react/api/router/linkComponent). - -### Using A Layout - -In the File Based Routing setup the layout is located in `src/routes/__root.tsx`. Anything you add to the root route will appear in all the routes. The route content will appear in the JSX where you render `{children}` in the `shellComponent`. - -Here is an example layout that includes a header: - -```tsx -import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router' - -export const Route = createRootRoute({ - head: () => ({ - meta: [ - { charSet: 'utf-8' }, - { name: 'viewport', content: 'width=device-width, initial-scale=1' }, - { title: 'My App' }, - ], - }), - shellComponent: ({ children }) => ( - - - - - -
- -
- {children} - - - - ), -}) -``` - -More information on layouts can be found in the [Layouts documentation](https://tanstack.com/router/latest/docs/framework/react/guide/routing-concepts#layouts). - -## Server Functions - -TanStack Start provides server functions that allow you to write server-side code that seamlessly integrates with your client components. - -```tsx -import { createServerFn } from '@tanstack/react-start' - -const getServerTime = createServerFn({ - method: 'GET', -}).handler(async () => { - return new Date().toISOString() -}) - -// Use in a component -function MyComponent() { - const [time, setTime] = useState('') - - useEffect(() => { - getServerTime().then(setTime) - }, []) - - return
Server time: {time}
-} -``` - -## API Routes - -You can create API routes by using the `server` property in your route definitions: - -```tsx -import { createFileRoute } from '@tanstack/react-router' -import { json } from '@tanstack/react-start' - -export const Route = createFileRoute('/api/hello')({ - server: { - handlers: { - GET: () => json({ message: 'Hello, World!' }), - }, - }, -}) -``` - -## Data Fetching - -There are multiple ways to fetch data in your application. You can use TanStack Query to fetch data from a server. But you can also use the `loader` functionality built into TanStack Router to load the data for a route before it's rendered. - -For example: - -```tsx -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/people')({ - loader: async () => { - const response = await fetch('https://swapi.dev/api/people') - return response.json() - }, - component: PeopleComponent, -}) - -function PeopleComponent() { - const data = Route.useLoaderData() - return ( - - ) -} -``` - -Loaders simplify your data fetching logic dramatically. Check out more information in the [Loader documentation](https://tanstack.com/router/latest/docs/framework/react/guide/data-loading#loader-parameters). - -# Demo files - -Files prefixed with `demo` can be safely deleted. They are there to provide a starting point for you to play around with the features you've installed. - -# Learn More - -You can learn more about all of the offerings from TanStack in the [TanStack documentation](https://tanstack.com). - -For TanStack Start specific documentation, visit [TanStack Start](https://tanstack.com/start). +- `src/routes/index.tsx` has main route details +- `src/components/party.tsx` contains quiz-specific details (game view, etc)