hngprojects / hng_boilerplate_nestjs

Description
Apache License 2.0
182 stars 105 forks source link

[FEAT]Specification for User Table Database Plan with Seeding and Migration Support using TypeORM #237

Closed posh1001 closed 2 weeks ago

posh1001 commented 1 month ago

Description:

Design and implement a structured database schema for managing user data in a Nest.js application using TypeORM. Include functionality to seed initial user data and ensure the database setup supports easy configuration switching and migration management.

Acceptance Criteria

Requirements:

1. Database Schema Design:

Column Name Data Type Constraints
id UUID Primary Key Default: UUID Generate
username VAR(50) Unique, Not Null
email VAR(20) Unique, Not Null
password VAR(50) Not Null
firstName VAR(50) Not Null
lastName VAR(50) Not Null
createdAt TIMESTAMP Default: Current Timestamp
updatedAt TIMESTAMP Default: Current Timestamp, On Update
Column Name Data Type Constraints
id UUID Primary Key Default: UUID Generate
name VAR(255) Unique, Not Null
email VAR(20) Unique, Not Null
description VAR(50) Null
industry VAR(50) Not Null
type VAR(50) Not Null
country VAR(50) Null
state VAR(50) Null
address VAR(50) Null
createdAt TIMESTAMP Default: Current Timestamp
updatedAt TIMESTAMP Default: Current Timestamp, On Update
Column Name Data Type Constraints
id UUID Primary Key, Default: UUID Generate
name VAR(255) Unique, Not Null
description VAR(20) Unique, Not Null
price VAR(50) Null
categoryId VAR(50) Foreign Key, Default: UUID Generate
createdAt TIMESTAMP Default: Current Timestamp
updatedAt TIMESTAMP Default: Current Timestamp, On Update

2. Nest.js and TypeORM Setup:

Database Configuration Data

import { DataSource } from 'typeorm';
import { User } from './entities/User';
const AppDataSource = new DataSource ({
   ***type***:  'postgres', // Change to your desired database type
   ** *host***:  process.env.DB_HOST || 'localhost',
   ***port***:  Number(process.env.DB_PORT) || 5432,
   ***username***:  process.env.DB_USER || 'user',
   ***password***:  process.env.DB_PASSWORD || 'password',
   ***database***:  process.env.DB_NAME || 'mydatabase',
   ***entities***:  [User],
   ***synchronize***:  true, // Set to false in production
   ***logging***:  true,
});

3. Seeding Initial Data:

Seeding Script

import AppDataSource from './data-source'; // Adjust import as necessary
import { User } from './entities/User';

const seedUsers = async () => {
  const userRepository = AppDataSource.getRepository(User);

  const users = [
    {
      username: 'poche',
      email: 'poche@gmail.com',
      password: 'securepassword', // Use hashed password in production
      firstName: 'paul',
      lastName: 'Orife',
    },
    {
      username: 'Fraciss',
      email: 'francis@yahoo.com',
      password: 'securepassword', // Use hashed password in production
      firstName: 'Francis',
      lastName: 'Smith',
    },
  ];

  await AppDataSource.initialize();

  for (const user of users) {
    await userRepository.save(user);
  }

  console.log('Seeded users successfully');
  await AppDataSource.destroy();
};

4. Migration Strategy:

5. Environment Flexibility:

6. Testing and Documentation:

6. Additional Considerations:

7. Dependencies:

References:

markessien commented 1 month ago

All db tasks are not testable