Skip to content

Commit

Permalink
feat: add post entity
Browse files Browse the repository at this point in the history
  • Loading branch information
Benjamin-Frost committed May 6, 2024
1 parent 30b29cf commit eccdced
Show file tree
Hide file tree
Showing 12 changed files with 189 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
import { AuthModule } from './auth/auth.module';
import { PostsModule } from './posts/posts.module';
import { UsersModule } from './users/users.module';

@Module({
Expand All @@ -25,6 +26,7 @@ import { UsersModule } from './users/users.module';
}),
inject: [ConfigService],
}),
PostsModule,
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', 'uploads'),
serveRoot: '/uploads',
Expand Down
12 changes: 12 additions & 0 deletions src/common/entities/base.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { PrimaryKey, Property } from '@mikro-orm/core';

export abstract class BaseEntity {
@PrimaryKey()
id: number;

@Property()
createdAt = new Date();

@Property({ onUpdate: () => new Date() })
updatedAt = new Date();
}
1 change: 1 addition & 0 deletions src/posts/dto/create-post.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class CreatePostDto {}
4 changes: 4 additions & 0 deletions src/posts/dto/update-post.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/mapped-types';
import { CreatePostDto } from './create-post.dto';

export class UpdatePostDto extends PartialType(CreatePostDto) {}
16 changes: 16 additions & 0 deletions src/posts/entities/post-comment.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Entity, ManyToOne, Property } from '@mikro-orm/core';
import { BaseEntity } from 'src/common/entities/base.entity';
import { User } from 'src/users/entities/user.entity';
import { Post } from './post.entity';

@Entity()
export class PostComment extends BaseEntity {
@Property()
text: string;

@ManyToOne({ entity: () => User, inversedBy: 'comments' })
author: User;

@ManyToOne({ entity: () => Post, inversedBy: 'comments' })
post: Post;
}
10 changes: 10 additions & 0 deletions src/posts/entities/post-location.embeddable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Embeddable, Property } from '@mikro-orm/core';

@Embeddable()
export class PostLocation {
@Property()
latitude: number;

@Property()
longitude: number;
}
16 changes: 16 additions & 0 deletions src/posts/entities/post-sticker.embeddable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Embeddable, Property } from '@mikro-orm/core';

@Embeddable()
export class PostSticker {
@Property()
id: number;

@Property()
x: number;

@Property()
y: number;

@Property()
rotation: number;
}
38 changes: 38 additions & 0 deletions src/posts/entities/post.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import {
Collection,
Embedded,
Entity,
ManyToMany,
ManyToOne,
OneToMany,
Property,
} from '@mikro-orm/core';
import { BaseEntity } from 'src/common/entities/base.entity';
import { User } from 'src/users/entities/user.entity';
import { PostComment } from './post-comment.entity';
import { PostLocation } from './post-location.embeddable';
import { PostSticker } from './post-sticker.embeddable';

@Entity()
export class Post extends BaseEntity {
@Property()
imageUrl: string;

@Property()
caption: string;

@ManyToOne({ entity: () => User, inversedBy: 'posts' })
author: User;

@Embedded(() => PostSticker, { array: true })
stickers: PostSticker[] = [];

@ManyToMany({ entity: () => User, inversedBy: 'likedPosts' })
likedBy = new Collection<User>(this);

@OneToMany({ entity: () => PostComment, mappedBy: 'post' })
comments = new Collection<PostComment>(this);

@Embedded(() => PostLocation)
location: PostLocation;
}
34 changes: 34 additions & 0 deletions src/posts/posts.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { PostsService } from './posts.service';
import { CreatePostDto } from './dto/create-post.dto';
import { UpdatePostDto } from './dto/update-post.dto';

@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}

@Post()
create(@Body() createPostDto: CreatePostDto) {
return this.postsService.create(createPostDto);
}

@Get()
findAll() {
return this.postsService.findAll();
}

@Get(':id')
findOne(@Param('id') id: string) {
return this.postsService.findOne(+id);
}

@Patch(':id')
update(@Param('id') id: string, @Body() updatePostDto: UpdatePostDto) {
return this.postsService.update(+id, updatePostDto);
}

@Delete(':id')
remove(@Param('id') id: string) {
return this.postsService.remove(+id);
}
}
9 changes: 9 additions & 0 deletions src/posts/posts.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { PostsService } from './posts.service';
import { PostsController } from './posts.controller';

@Module({
controllers: [PostsController],
providers: [PostsService],
})
export class PostsModule {}
26 changes: 26 additions & 0 deletions src/posts/posts.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Injectable } from '@nestjs/common';
import { CreatePostDto } from './dto/create-post.dto';
import { UpdatePostDto } from './dto/update-post.dto';

@Injectable()
export class PostsService {
create(createPostDto: CreatePostDto) {
return 'This action adds a new post';
}

findAll() {
return `This action returns all posts`;
}

findOne(id: number) {
return `This action returns a #${id} post`;
}

update(id: number, updatePostDto: UpdatePostDto) {
return `This action updates a #${id} post`;
}

remove(id: number) {
return `This action removes a #${id} post`;
}
}
26 changes: 21 additions & 5 deletions src/users/entities/user.entity.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import { Entity, PrimaryKey, Property, Unique } from '@mikro-orm/core';
import {
Collection,
Entity,
ManyToMany,
OneToMany,
Property,
Unique,
} from '@mikro-orm/core';
import { BaseEntity } from 'src/common/entities/base.entity';
import { PostComment } from 'src/posts/entities/post-comment.entity';
import { Post } from 'src/posts/entities/post.entity';

@Entity()
export class User {
@PrimaryKey()
id: number;

export class User extends BaseEntity {
@Property()
@Unique()
username: string;
Expand All @@ -14,4 +21,13 @@ export class User {

@Property({ nullable: true })
imageUrl?: string;

@OneToMany({ entity: () => Post, mappedBy: 'author' })
posts = new Collection<Post>(this);

@ManyToMany({ entity: () => Post, mappedBy: 'likedBy' })
likedPosts = new Collection<Post>(this);

@OneToMany({ entity: () => PostComment, mappedBy: 'author' })
comments = new Collection<PostComment>(this);
}

0 comments on commit eccdced

Please sign in to comment.