Skip to content

Commit

Permalink
Merge branch 'main' of https://codeberg.org/YamanQD/Labeeb
Browse files Browse the repository at this point in the history
  • Loading branch information
HasanMothaffar committed Jul 13, 2022
2 parents a8f3f10 + 6e53f68 commit f4aeccf
Show file tree
Hide file tree
Showing 21 changed files with 347 additions and 34 deletions.
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,10 @@
"eslint": "^8.14.0",
"prettier": "^2.6.2",
"typescript": "^4.6.3"
},
"dependenciesMeta": {
"typeorm-seeding@1.6.1": {
"unplugged": true
}
}
}
7 changes: 5 additions & 2 deletions packages/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"seed": "ts-node ../../.yarn/unplugged/typeorm-seeding-virtual-a22ff67e2d/node_modules/typeorm-seeding/dist/cli.js seed",
"start": "nest start",
"start-dev": "nest start --watch",
"start-debug": "nest start --debug --watch",
Expand Down Expand Up @@ -46,9 +47,11 @@
"rimraf": "^3.0.2",
"rxjs": "^7.2.0",
"swagger-ui-express": "^4.3.0",
"typeorm": "^0.3.6"
"typeorm": "^0.3.6",
"typeorm-seeding": "^1.6.1"
},
"devDependencies": {
"@faker-js/faker": "^7.3.0",
"@nestjs/cli": "^8.0.0",
"@nestjs/schematics": "^8.0.0",
"@types/express": "^4.17.13",
Expand All @@ -68,4 +71,4 @@
"typescript": "^4.3.5"
},
"packageManager": "yarn@3.2.0"
}
}
5 changes: 4 additions & 1 deletion packages/server/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ import { TasksModule } from './tasks/tasks.module';
import { Task } from './tasks/task.entity';
import { ProjectsModule } from './projects/projects.module';
import { Project } from './projects/project.entity';
import { List } from './lists/list.entity';
import { ListsModule } from './lists/lists.module';

@Module({
imports: [
Expand All @@ -29,14 +31,15 @@ import { Project } from './projects/project.entity';
username: configService.get<string>('DATABASE_USERNAME'),
password: configService.get<string>('DATABASE_PASSWORD'),
database: configService.get<string>('DATABASE_NAME'),
entities: [User, Task, Project],
entities: [User, Task, Project, List],
synchronize: true, //! DO NOT USE IN PRODUCTION
};
},
inject: [ConfigService]
}),
TasksModule,
ProjectsModule,
ListsModule
],
controllers: [AppController],
providers: [
Expand Down
15 changes: 15 additions & 0 deletions packages/server/src/db/seeding/factories/task.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { faker } from '@faker-js/faker';
import { Priority } from 'src/enums/priority.enum';
import { Task } from 'src/tasks/task.entity';
import { define } from "typeorm-seeding";

const priorities = [Priority.HIGH, Priority.MEDIUM, Priority.LOW, Priority.NONE];

define(Task, () => {
const task = new Task();
task.title = faker.lorem.sentence();
task.description = faker.lorem.paragraph();
task.priority = priorities[Math.floor(Math.random() * 100) % priorities.length];
task.deadline = faker.date.future();
return task;
});
10 changes: 10 additions & 0 deletions packages/server/src/db/seeding/factories/user.factory.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { faker } from '@faker-js/faker';
import { User } from "src/users/user.entity";
import { define } from "typeorm-seeding";

define(User, () => {
const user = new User();
user.username = faker.internet.userName();
user.password = faker.internet.password();
return user;
});
11 changes: 11 additions & 0 deletions packages/server/src/lists/dto/create-list-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Type } from 'class-transformer';
import { IsNotEmpty } from 'class-validator';

export class CreateListDto {
@IsNotEmpty()
@Type(() => String)
name: string;

@IsNotEmpty()
projectId: number;
}
4 changes: 4 additions & 0 deletions packages/server/src/lists/dto/update-list-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from "@nestjs/mapped-types";
import { CreateListDto } from "./create-list-dto";

export class UpdateListDto extends PartialType(CreateListDto) { }
18 changes: 18 additions & 0 deletions packages/server/src/lists/list.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Project } from 'src/projects/project.entity';
import { Task } from 'src/tasks/task.entity';
import { Entity, Column, PrimaryGeneratedColumn, OneToMany, ManyToOne } from 'typeorm';

@Entity()
export class List {
@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@ManyToOne(() => Project, project => project.lists)
project: Project;

@OneToMany(() => Task, task => task.list)
tasks: Task[];
}
20 changes: 20 additions & 0 deletions packages/server/src/lists/lists.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { Task } from 'src/tasks/task.entity';
import { CreateListDto } from './dto/create-list-dto';
import { List } from './list.entity';
import { ListsService } from './lists.service';

@Controller('lists')
export class ListsController {
constructor(private readonly listsService: ListsService) { }

@Get(':id')
async findListTasks(@Param('id') id: number): Promise<Task[]> {
return await this.listsService.findListTasks(id);
}

@Post()
async create(@Body() body: CreateListDto): Promise<List> {
return await this.listsService.create(body);
}
}
13 changes: 13 additions & 0 deletions packages/server/src/lists/lists.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Project } from 'src/projects/project.entity';
import { List } from './list.entity';
import { ListsController } from './lists.controller';
import { ListsService } from './lists.service';

@Module({
imports: [TypeOrmModule.forFeature([List, Project])],
controllers: [ListsController],
providers: [ListsService]
})
export class ListsModule { }
38 changes: 38 additions & 0 deletions packages/server/src/lists/lists.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Project } from 'src/projects/project.entity';
import { Task } from 'src/tasks/task.entity';
import { Repository } from 'typeorm';
import { CreateListDto } from './dto/create-list-dto';
import { List } from './list.entity';

@Injectable()
export class ListsService {
constructor(
@InjectRepository(List)
private readonly listRepository: Repository<List>,
@InjectRepository(Project)
private readonly projectRepository: Repository<Project>
) { }

async create(list: CreateListDto): Promise<List> {
const project = await this.projectRepository.findOne({ where: { id: list.projectId } });
if (!project) {
throw new NotFoundException('Project not found');
}

return await this.listRepository.save({ ...list, project });
}

async findListTasks(id: number): Promise<Task[]> {
const list = await this.listRepository.findOne({
where: { id },
relations: { tasks: true }
});
if (!list) {
throw new NotFoundException('List not found');
}

return list.tasks;
}
}
8 changes: 8 additions & 0 deletions packages/server/src/projects/dto/create-project-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { Type } from 'class-transformer';
import { IsNotEmpty } from 'class-validator';

export class CreateProjectDto {
@IsNotEmpty()
@Type(() => String)
name: string;
}
4 changes: 4 additions & 0 deletions packages/server/src/projects/dto/update-project-dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from "@nestjs/mapped-types";
import { CreateProjectDto } from "./create-project-dto";

export class UpdateProjectDto extends PartialType(CreateProjectDto) { }
6 changes: 3 additions & 3 deletions packages/server/src/projects/project.entity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Task } from 'src/tasks/task.entity';
import { List } from 'src/lists/list.entity';
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm';

@Entity()
Expand All @@ -9,6 +9,6 @@ export class Project {
@Column()
name: string;

@OneToMany(() => Task, task => task.project)
tasks: Task[];
@OneToMany(() => List, list => list.project)
lists: List[];
}
14 changes: 8 additions & 6 deletions packages/server/src/projects/projects.controller.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
import { Body, Controller, Get, Param, Post, } from '@nestjs/common';
import { Task } from 'src/tasks/task.entity';
import { Body, Controller, Get, Param, Post } from '@nestjs/common';
import { CreateProjectDto } from './dto/create-project-dto';
import { Project } from './project.entity';
import { ProjectsService } from './projects.service';

@Controller('projects')
export class ProjectsController {
constructor(private readonly projectsService: ProjectsService) { }

@Get()
async findAll(): Promise<Project[]> {
return await this.projectsService.findAll();
}

@Get(':id/tasks')
async findProjectTasks(@Param('id') id): Promise<Task[]> {
async findProjectTasks(@Param('id') id: number): Promise<any> {
return await this.projectsService.findProjectTasks(id);
}

@Post()
async create(@Body() body: any): Promise<Project> {
async create(@Body() body: CreateProjectDto): Promise<Project> {
return await this.projectsService.create(body);
}

// }
}
14 changes: 9 additions & 5 deletions packages/server/src/projects/projects.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Task } from 'src/tasks/task.entity';
import { Repository } from 'typeorm';
import { CreateProjectDto } from './dto/create-project-dto';
import { Project } from './project.entity';

@Injectable()
Expand All @@ -11,19 +11,23 @@ export class ProjectsService {
private readonly projectRepository: Repository<Project>
) { }

async findProjectTasks(id: number): Promise<Task[]> {
async findAll(): Promise<Project[]> {
return await this.projectRepository.find({ relations: { lists: true } });
}

async findProjectTasks(id: number): Promise<any> {
const project = await this.projectRepository.findOne({
where: { id },
relations: { tasks: true }
relations: ['lists', 'lists.tasks'],
});
if (!project) {
throw new NotFoundException('Project not found');
}

return project.tasks;
return project;
}

async create(project: Project): Promise<Project> {
async create(project: CreateProjectDto): Promise<Project> {
return await this.projectRepository.save(project);
}
}
2 changes: 1 addition & 1 deletion packages/server/src/tasks/dto/create-task.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export class CreateTaskDto {
title: string;

@IsNotEmpty()
projectId: number;
listId: number;

@IsOptional()
description?: string;
Expand Down
6 changes: 3 additions & 3 deletions packages/server/src/tasks/task.entity.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';
import { Priority } from 'src/enums/priority.enum';
import { Project } from 'src/projects/project.entity';
import { List } from 'src/lists/list.entity';

@Entity()
export class Task {
Expand All @@ -19,8 +19,8 @@ export class Task {
@Column({ nullable: true })
deadline: Date;

@ManyToOne(() => Project, project => project.tasks)
project: Project;
@ManyToOne(() => List, list => list.tasks)
list: List;

@Column()
created_by: number;
Expand Down
4 changes: 2 additions & 2 deletions packages/server/src/tasks/tasks.module.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Project } from 'src/projects/project.entity';
import { List } from 'src/lists/list.entity';
import { Task } from './task.entity';
import { TasksController } from './tasks.controller';
import { TasksService } from './tasks.service';

@Module({
imports: [TypeOrmModule.forFeature([Project, Task])],
imports: [TypeOrmModule.forFeature([List, Task])],
controllers: [TasksController],
providers: [TasksService]
})
Expand Down
10 changes: 5 additions & 5 deletions packages/server/src/tasks/tasks.service.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Project } from 'src/projects/project.entity';
import { List } from 'src/lists/list.entity';
import { Repository } from 'typeorm';
import { CreateTaskDto } from './dto/create-task.dto';
import { UpdateTaskDto } from './dto/update-task.dto';
Expand All @@ -11,8 +11,8 @@ export class TasksService {
constructor(
@InjectRepository(Task)
private readonly taskRepository: Repository<Task>,
@InjectRepository(Project)
private readonly projectRepository: Repository<Project>
@InjectRepository(List)
private readonly listRepository: Repository<List>
) { }

async findAll(): Promise<Task[]> {
Expand All @@ -28,12 +28,12 @@ export class TasksService {
}

async create(body: CreateTaskDto, userId: any): Promise<Task> {
const project = await this.projectRepository.findOne({ where: { id: body.projectId } });
const list = await this.listRepository.findOne({ where: { id: body.listId } });

const task = this.taskRepository.create({
created_by: userId,
createdAt: new Date(),
project: project,
list: list,
...body
});

Expand Down

0 comments on commit f4aeccf

Please sign in to comment.