From ad76568b9da8004fe2d5a59125eef061e3c578a6 Mon Sep 17 00:00:00 2001 From: Avery Huang Date: Sat, 7 Sep 2024 21:55:07 -0400 Subject: [PATCH 1/7] postgres setup + onboarding steps --- .env.example | 5 + .gitignore | 1 + README.md | 23 +++- apps/backend/README.md | 28 ++++ apps/backend/resources/pg-setup-1.png | Bin 0 -> 22633 bytes apps/backend/resources/pg-setup-2.png | Bin 0 -> 17162 bytes apps/backend/src/app.module.ts | 24 ++-- apps/backend/src/config/typeorm.ts | 22 +++ .../src/migrations/1725726359198-User.ts | 19 +++ .../src/strategies/plural-naming.strategy.ts | 26 +--- apps/backend/src/users/user.entity.ts | 15 ++- package.json | 11 +- yarn.lock | 125 +++++++++++++++++- 13 files changed, 255 insertions(+), 44 deletions(-) create mode 100644 .env.example create mode 100644 apps/backend/README.md create mode 100644 apps/backend/resources/pg-setup-1.png create mode 100644 apps/backend/resources/pg-setup-2.png create mode 100644 apps/backend/src/config/typeorm.ts create mode 100644 apps/backend/src/migrations/1725726359198-User.ts diff --git a/.env.example b/.env.example new file mode 100644 index 00000000..c0ee816e --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +DATABASE_HOST=localhost +DATABASE_PORT=5432 +DATABASE_NAME=securing-safe-food +DATABASE_USERNAME=postgres +DATABASE_PASSWORD=PLACEHOLDER_PASSWORD \ No newline at end of file diff --git a/.gitignore b/.gitignore index 6033c03e..0e2cd373 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ Thumbs.db # Environment file *.env *.env.* +!.env.example diff --git a/README.md b/README.md index fa1b09c0..a9f3469e 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,30 @@ -# Scaffolding +# Securing Safe Food ✨ **This workspace has been generated by [Nx, a Smart, fast and extensible build system.](https://nx.dev)** ✨ +## Environment Setup + +Install app dependencies by running this at the repo root (`ssf`) + +``` +yarn install +``` + +To setup your backend, follow the backend-specific instructions [here](apps/backend/README.md) + +*Note: you may need to prefix your `nx` commands with `npx`. For example, to serve the frontend, if: +``` +nx serve frontend +``` + +doesn't work, try: + +``` +npx nx serve frontend +``` + ## Start the app To start the development server run `nx serve frontend`. Open your browser and navigate to http://localhost:4200/. Happy coding! diff --git a/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 00000000..8e4e513c --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,28 @@ +## Backend Setup + +This part can be a little tricky! If you run into some confusing errors along the way, don't be afraid to reach out if have any trouble! + +You'll need to download: + +1. [PostgreSQL](https://www.postgresql.org/download/) +2. [PgAdmin 4](https://www.pgadmin.org/download/) (if PostgreSQL didn't come with it) + +Then, set up a database called `securing-safe-food`. If you're not familiar with how to do so, it's easy to do through PgAdmin + +1. Open PgAdmin and configure your credentials (if necessary). Then, right click on the `Databases` dropdown (under `Servers` > `PostgreSQL [version]`) + +![alt text](resources/pg-setup-1.png) + +2. Enter "securing-safe-food" as the database name + +![alt text](resources/pg-setup-2.png) + +Next, create a file called `.env` in the **root directory** (under `ssf/`) and copy over the contents from `.env.example`. Replace `DATABASE_PASSWORD` with the password you entered for the `postgres` user (NOT necessarily your PgAdmin master password!) + +You can check that your database connection details are correct by running `nx serve backend` - if you can see the following line in the terminal, then you've got it right! + +``` +"LOG 🚀 Application is running on: http://localhost:3000/api" +``` + +Finally, run `yarn run typeorm:migrate` to load all the tables into your database. If everything is set up correctly, you should see "Migration ... has been executed successfully." in the terminal. \ No newline at end of file diff --git a/apps/backend/resources/pg-setup-1.png b/apps/backend/resources/pg-setup-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0d401be42ea5a4cd3684a31c63942b38a690d23e GIT binary patch literal 22633 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

3rEDeaeT!gSooaYh+J{Q(dhZ8puP5|i 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 literal 0 HcmV?d00001 diff --git a/apps/backend/resources/pg-setup-2.png b/apps/backend/resources/pg-setup-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8805fc0c7dce2eccb9cda5622e3cff7fd982a6 GIT binary patch literal 17162 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 AQvd(} literal 0 HcmV?d00001 diff --git a/apps/backend/src/app.module.ts b/apps/backend/src/app.module.ts index 0a6461c8..8fc31d76 100644 --- a/apps/backend/src/app.module.ts +++ b/apps/backend/src/app.module.ts @@ -5,22 +5,20 @@ import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UsersModule } from './users/users.module'; import { AuthModule } from './auth/auth.module'; -import { PluralNamingStrategy } from './strategies/plural-naming.strategy'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import typeorm from './config/typeorm'; @Module({ imports: [ - TypeOrmModule.forRoot({ - type: 'mongodb', - host: '127.0.0.1', - port: 27017, - database: 'c4cOpsTest', - // username: 'root', - // password: 'root', - autoLoadEntities: true, - // entities: [join(__dirname, '**/**.entity.{ts,js}')], - // Setting synchronize: true shouldn't be used in production - otherwise you can lose production data - synchronize: true, - namingStrategy: new PluralNamingStrategy(), + ConfigModule.forRoot({ + isGlobal: true, + load: [typeorm], + }), + // Load TypeORM config async so we can target the config file (config/typeorm.ts) for migrations + TypeOrmModule.forRootAsync({ + inject: [ConfigService], + useFactory: async (configService: ConfigService) => + configService.get('typeorm'), }), UsersModule, AuthModule, diff --git a/apps/backend/src/config/typeorm.ts b/apps/backend/src/config/typeorm.ts new file mode 100644 index 00000000..fe2cb85f --- /dev/null +++ b/apps/backend/src/config/typeorm.ts @@ -0,0 +1,22 @@ +import { registerAs } from '@nestjs/config'; +import { PluralNamingStrategy } from '../strategies/plural-naming.strategy'; +import { DataSource, DataSourceOptions } from 'typeorm'; +import { User1725726359198 } from '../migrations/1725726359198-User'; + +const config = { + type: 'postgres', + host: `${process.env.DATABASE_HOST}`, + port: parseInt(`${process.env.DATABASE_PORT}`, 10), + database: `${process.env.DATABASE_NAME}`, + username: `${process.env.DATABASE_USERNAME}`, + password: `${process.env.DATABASE_PASSWORD}`, + autoLoadEntities: true, + synchronize: false, + namingStrategy: new PluralNamingStrategy(), + // Glob patterns (e.g. ../migrations/**.ts) are deprecated, so we have to manually specify each migration + // TODO: see if there's still a way to dynamically load all migrations + migrations: [User1725726359198], +}; + +export default registerAs('typeorm', () => config); +export const connectionSource = new DataSource(config as DataSourceOptions); diff --git a/apps/backend/src/migrations/1725726359198-User.ts b/apps/backend/src/migrations/1725726359198-User.ts new file mode 100644 index 00000000..6c887ca3 --- /dev/null +++ b/apps/backend/src/migrations/1725726359198-User.ts @@ -0,0 +1,19 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class User1725726359198 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + status VARCHAR(20), + first_name VARCHAR(255), + last_name VARCHAR(255), + email VARCHAR(255) + )`, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`DROP TABLE IF EXISTS users`); + } +} diff --git a/apps/backend/src/strategies/plural-naming.strategy.ts b/apps/backend/src/strategies/plural-naming.strategy.ts index bf3a5122..b3b3614d 100644 --- a/apps/backend/src/strategies/plural-naming.strategy.ts +++ b/apps/backend/src/strategies/plural-naming.strategy.ts @@ -1,22 +1,10 @@ -import { DefaultNamingStrategy, NamingStrategyInterface } from 'typeorm'; +import { SnakeNamingStrategy } from 'typeorm-naming-strategies'; -export class PluralNamingStrategy - extends DefaultNamingStrategy - implements NamingStrategyInterface -{ - tableName(targetName: string, userSpecifiedName: string | undefined): string { - return userSpecifiedName || targetName.toLowerCase() + 's'; // Pluralize the table name - } - - columnName( - propertyName: string, - customName: string, - embeddedPrefixes: string[], - ): string { - return propertyName; - } - - relationName(propertyName: string): string { - return propertyName; +// Extend SnakeNamingStrategy to follow Postgres naming conventions +export class PluralNamingStrategy extends SnakeNamingStrategy { + tableName(targetName: string, userSpecifiedName: string): string { + return ( + userSpecifiedName || super.tableName(targetName, userSpecifiedName) + 's' + ); // Pluralize the table name } } diff --git a/apps/backend/src/users/user.entity.ts b/apps/backend/src/users/user.entity.ts index dc537091..52afafc0 100644 --- a/apps/backend/src/users/user.entity.ts +++ b/apps/backend/src/users/user.entity.ts @@ -1,16 +1,17 @@ -import { Entity, Column, ObjectIdColumn, ObjectId } from 'typeorm'; +import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'; -import type { Status } from './types'; +import { Status } from './types'; @Entity() export class User { - @ObjectIdColumn() - _id: ObjectId; - - @Column({ primary: true }) + @PrimaryGeneratedColumn() id: number; - @Column() + @Column({ + type: 'varchar', + length: 20, + default: Status.STANDARD, + }) status: Status; @Column() diff --git a/package.json b/package.json index 3f851e45..67a0cd6e 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,15 @@ "lint": "eslint apps/frontend --ext .ts,.tsx --fix && eslint apps/backend --ext .ts,.tsx --fix", "prepush": "yarn run format:check && yarn run lint:check", "prepush:fix": "yarn run format && yarn run lint", - "prepare": "husky install" + "prepare": "husky install", + "typeorm:migrate": "npx ts-node -r dotenv/config ./node_modules/typeorm/cli.js migration:run -d apps/backend/src/config/typeorm.ts" }, "private": true, "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.410.0", "@nestjs/cli": "^10.1.17", "@nestjs/common": "^10.0.2", + "@nestjs/config": "^3.2.3", "@nestjs/core": "^10.0.2", "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.2", @@ -26,17 +28,20 @@ "axios": "^1.5.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", + "dotenv": "^16.4.5", "global": "^4.4.0", "jwks-rsa": "^3.1.0", "mongodb": "^6.1.0", "passport": "^0.6.0", "passport-jwt": "^4.0.1", + "pg": "^8.12.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.15.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", - "typeorm": "^0.3.17" + "typeorm": "^0.3.17", + "typeorm-naming-strategies": "^4.1.0" }, "devDependencies": { "@nestjs/schematics": "^10.0.2", @@ -74,6 +79,8 @@ "nx-cloud": "^16.4.0", "prettier": "^2.6.2", "ts-jest": "^29.1.0", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3", "vite": "^4.3.9", "vitest": "^0.32.0" diff --git a/yarn.lock b/yarn.lock index 90853e9d..5f15ca32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2116,6 +2116,15 @@ iterare "1.2.1" tslib "2.6.2" +"@nestjs/config@^3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@nestjs/config/-/config-3.2.3.tgz#569888a33ada50b0f182002015e152e054990016" + integrity sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w== + dependencies: + dotenv "16.4.5" + dotenv-expand "10.0.0" + lodash "4.17.21" + "@nestjs/core@^10.0.2": version "10.2.7" resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-10.2.7.tgz#26ca5cc63504b54a08c4cdc6da9300c9b8904fde" @@ -5703,11 +5712,16 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dotenv-expand@~10.0.0: +dotenv-expand@10.0.0, dotenv-expand@~10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== +dotenv@16.4.5, dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + dotenv@^16.0.3, dotenv@~16.3.1: version "16.3.1" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" @@ -9553,6 +9567,62 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== +pg-cloudflare@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" + integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== + +pg-connection-string@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.4.tgz#f543862adfa49fa4e14bc8a8892d2a84d754246d" + integrity sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA== + +pg-int8@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" + integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== + +pg-pool@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.2.tgz#3a592370b8ae3f02a7c8130d245bc02fa2c5f3f2" + integrity sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg== + +pg-protocol@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.1.tgz#21333e6d83b01faaebfe7a33a7ad6bfd9ed38cb3" + integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== + +pg-types@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" + integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== + dependencies: + pg-int8 "1.0.1" + postgres-array "~2.0.0" + postgres-bytea "~1.0.0" + postgres-date "~1.0.4" + postgres-interval "^1.1.0" + +pg@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/pg/-/pg-8.12.0.tgz#9341724db571022490b657908f65aee8db91df79" + integrity sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ== + dependencies: + pg-connection-string "^2.6.4" + pg-pool "^3.6.2" + pg-protocol "^1.6.1" + pg-types "^2.1.0" + pgpass "1.x" + optionalDependencies: + pg-cloudflare "^1.1.1" + +pgpass@1.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" + integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== + dependencies: + split2 "^4.1.0" + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -9884,6 +9954,28 @@ postcss@^8.4.14, postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.27: picocolors "^1.0.0" source-map-js "^1.0.2" +postgres-array@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" + integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== + +postgres-bytea@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" + integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== + +postgres-date@~1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" + integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== + +postgres-interval@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" + integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== + dependencies: + xtend "^4.0.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -10797,6 +10889,11 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" +split2@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11324,6 +11421,25 @@ ts-node@10.9.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths-webpack-plugin@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/tsconfig-paths-webpack-plugin/-/tsconfig-paths-webpack-plugin-4.0.0.tgz#84008fc3e3e0658fdb0262758b07b4da6265ff1a" @@ -11342,7 +11458,7 @@ tsconfig-paths-webpack-plugin@4.1.0: enhanced-resolve "^5.7.0" tsconfig-paths "^4.1.2" -tsconfig-paths@4.2.0, tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: +tsconfig-paths@4.2.0, tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2, tsconfig-paths@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== @@ -11474,6 +11590,11 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +typeorm-naming-strategies@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/typeorm-naming-strategies/-/typeorm-naming-strategies-4.1.0.tgz#1ec6eb296c8d7b69bb06764d5b9083ff80e814a9" + integrity sha512-vPekJXzZOTZrdDvTl1YoM+w+sUIfQHG4kZTpbFYoTsufyv9NIBRe4Q+PdzhEAFA2std3D9LZHEb1EjE9zhRpiQ== + typeorm@^0.3.17: version "0.3.17" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" From d92dddb2da9894518647bfd0ac3e10fa4a3648a7 Mon Sep 17 00:00:00 2001 From: huang0h Date: Mon, 16 Sep 2024 18:35:57 -0400 Subject: [PATCH 2/7] add pantries + donations tables --- .../src/migrations/1726524792261-addTables.ts | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 apps/backend/src/migrations/1726524792261-addTables.ts diff --git a/apps/backend/src/migrations/1726524792261-addTables.ts b/apps/backend/src/migrations/1726524792261-addTables.ts new file mode 100644 index 00000000..b82bfd89 --- /dev/null +++ b/apps/backend/src/migrations/1726524792261-addTables.ts @@ -0,0 +1,39 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddTables1726524792261 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `CREATE TABLE IF NOT EXISTS pantries ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + address VARCHAR(255) NOT NULL, + approved BOOLEAN NOT NULL, + ssf_representative_id INT NOT NULL, + pantry_representative_id INT NOT NULL, + restrictions TEXT[] NOT NULL, + + CONSTRAINT fk_ssf_representative_id FOREIGN KEY(ssf_representative_id) REFERENCES user(id), + CONSTRAINT fk_pantry_representative_id FOREIGN KEY(pantry_representative_id) REFERENCES user(id), + ); + + CREATE TABLE IF NOT EXISTS donations ( + id SERIAL PRIMARY KEY, + restrictions TEXT[] NOT NULL, + due_date TIMESTAMP NOT NULL, + pantry_id INT NOT NULL, + status VARCHAR(50) NOT NULL, + feedback TEXT, + contents TEXT NOT NULL, + + CONSTRAINT fk_pantry_id FOREIGN KEY(pantry_id) REFERENCES pantry(id), + ); + `, + ); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP TABLE IF EXISTS pantries; DROP TABLE IF EXISTS donations;`, + ); + } +} From ed4e0d70e6029e36a1cb63c68e3b5237a2d75d2d Mon Sep 17 00:00:00 2001 From: Avery Huang Date: Mon, 16 Sep 2024 19:10:23 -0400 Subject: [PATCH 3/7] fix migrations --- apps/backend/src/config/typeorm.ts | 3 ++- apps/backend/src/migrations/1726524792261-addTables.ts | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/backend/src/config/typeorm.ts b/apps/backend/src/config/typeorm.ts index fe2cb85f..e75f65b3 100644 --- a/apps/backend/src/config/typeorm.ts +++ b/apps/backend/src/config/typeorm.ts @@ -2,6 +2,7 @@ import { registerAs } from '@nestjs/config'; import { PluralNamingStrategy } from '../strategies/plural-naming.strategy'; import { DataSource, DataSourceOptions } from 'typeorm'; import { User1725726359198 } from '../migrations/1725726359198-User'; +import { AddTables1726524792261 } from '../migrations/1726524792261-addTables'; const config = { type: 'postgres', @@ -15,7 +16,7 @@ const config = { namingStrategy: new PluralNamingStrategy(), // Glob patterns (e.g. ../migrations/**.ts) are deprecated, so we have to manually specify each migration // TODO: see if there's still a way to dynamically load all migrations - migrations: [User1725726359198], + migrations: [User1725726359198, AddTables1726524792261], }; export default registerAs('typeorm', () => config); diff --git a/apps/backend/src/migrations/1726524792261-addTables.ts b/apps/backend/src/migrations/1726524792261-addTables.ts index b82bfd89..df2c7bf0 100644 --- a/apps/backend/src/migrations/1726524792261-addTables.ts +++ b/apps/backend/src/migrations/1726524792261-addTables.ts @@ -12,8 +12,8 @@ export class AddTables1726524792261 implements MigrationInterface { pantry_representative_id INT NOT NULL, restrictions TEXT[] NOT NULL, - CONSTRAINT fk_ssf_representative_id FOREIGN KEY(ssf_representative_id) REFERENCES user(id), - CONSTRAINT fk_pantry_representative_id FOREIGN KEY(pantry_representative_id) REFERENCES user(id), + CONSTRAINT fk_ssf_representative_id FOREIGN KEY(ssf_representative_id) REFERENCES users(id), + CONSTRAINT fk_pantry_representative_id FOREIGN KEY(pantry_representative_id) REFERENCES users(id) ); CREATE TABLE IF NOT EXISTS donations ( @@ -25,7 +25,7 @@ export class AddTables1726524792261 implements MigrationInterface { feedback TEXT, contents TEXT NOT NULL, - CONSTRAINT fk_pantry_id FOREIGN KEY(pantry_id) REFERENCES pantry(id), + CONSTRAINT fk_pantry_id FOREIGN KEY(pantry_id) REFERENCES pantries(id) ); `, ); From 0086a3cd57a7279e0981e3d2e12881150e7105c2 Mon Sep 17 00:00:00 2001 From: nadishiro17 <98122522+nadishiro17@users.noreply.github.com> Date: Fri, 20 Sep 2024 18:10:19 -0400 Subject: [PATCH 4/7] New icon --- apps/frontend/public/favicon.ico | Bin 15086 -> 6500 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/frontend/public/favicon.ico b/apps/frontend/public/favicon.ico index 317ebcb2336e0833a22dddf0ab287849f26fda57..c4f6a143296d40005e1d7e1f879bd98a34cccffe 100644 GIT binary patch literal 6500 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 literal 15086 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 Date: Fri, 20 Sep 2024 18:12:15 -0400 Subject: [PATCH 5/7] Changed favicon and page title to SSF --- apps/frontend/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/frontend/index.html b/apps/frontend/index.html index 47f54c98..4f44fcfa 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -2,6 +2,7 @@ + SSF Frontend From 32910dac0b9ea413fe37e43de41a563f543533ac Mon Sep 17 00:00:00 2001 From: nadishiro17 <98122522+nadishiro17@users.noreply.github.com> Date: Fri, 20 Sep 2024 18:12:50 -0400 Subject: [PATCH 6/7] Changed favicon and page title to SSF --- apps/frontend/src/app.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/frontend/src/app.tsx b/apps/frontend/src/app.tsx index a51df65b..444b5bb2 100644 --- a/apps/frontend/src/app.tsx +++ b/apps/frontend/src/app.tsx @@ -20,6 +20,7 @@ const router = createBrowserRouter([ export const App: React.FC = () => { useEffect(() => { + document.title = 'SSF'; apiClient.getHello().then((res) => console.log(res)); }, []); From 705fc46e314ed6d8f6c1be69a46d80170346eadb Mon Sep 17 00:00:00 2001 From: nadishiro17 <98122522+nadishiro17@users.noreply.github.com> Date: Tue, 8 Oct 2024 18:55:04 -0400 Subject: [PATCH 7/7] Update index.html --- apps/frontend/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/frontend/index.html b/apps/frontend/index.html index 4f44fcfa..ebde308b 100644 --- a/apps/frontend/index.html +++ b/apps/frontend/index.html @@ -3,7 +3,6 @@ SSF - Frontend