Skip to content

Commit 9dbfe7f

Browse files
committed
Blogpost stuff
1 parent a265fad commit 9dbfe7f

8 files changed

+72
-7
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { MigrationInterface, QueryRunner } from "typeorm";
2+
3+
export class BlogpostDescription1739471947194 implements MigrationInterface {
4+
name = "BlogpostDescription1739471947194";
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(
8+
`ALTER TABLE "blogpost_entity" ADD "short_description" text NOT NULL DEFAULT ''`,
9+
);
10+
}
11+
12+
public async down(queryRunner: QueryRunner): Promise<void> {
13+
await queryRunner.query(
14+
`ALTER TABLE "blogpost_entity" DROP COLUMN "short_description"`,
15+
);
16+
}
17+
}

src/entity/blogpost.entity.ts

+7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ export class BlogpostEntity {
1818
@Column({ name: "image_key" })
1919
imageKey: string;
2020

21+
@Column({
22+
type: "text",
23+
name: "short_description",
24+
default: "",
25+
})
26+
shortDescription: string;
27+
2128
@Column({
2229
type: "text",
2330
name: "content",

src/rest/blogpost/blogpost.controller.ts

+21-5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import { BlogpostMapper } from "./blogpost.mapper";
2626
import { WithPagination } from "../../utils/decorator/pagination";
2727
import { NullableIntPipe } from "../../utils/pipes";
2828
import { makePage } from "../../gateway/util/make-page";
29+
import { ForumApi } from "../../generated-api/forum";
30+
import { ThreadType } from "../../gateway/shared-types/thread-type";
2931

3032
@Controller("blog")
3133
@ApiTags("blog")
@@ -34,6 +36,7 @@ export class BlogpostController {
3436
@InjectRepository(BlogpostEntity)
3537
private readonly blogpostEntityRepository: Repository<BlogpostEntity>,
3638
private readonly mapper: BlogpostMapper,
39+
private readonly forumApi: ForumApi,
3740
) {}
3841

3942
@ModeratorGuard()
@@ -45,16 +48,20 @@ export class BlogpostController {
4548
): Promise<BlogpostDto> {
4649
let blogpost: BlogpostEntity;
4750
if (dto.id) {
48-
blogpost = await this.blogpostEntityRepository.findOne({
51+
blogpost = await this.blogpostEntityRepository.findOneOrFail({
4952
where: { id: dto.id },
5053
});
5154
} else {
5255
blogpost = new BlogpostEntity();
5356
blogpost.author = user.steam_id;
57+
blogpost.imageKey = `upload/dotaold.jpg`; // Very bad hack but wcyd
5458
}
5559
blogpost.content = dto.content;
56-
blogpost.imageKey = dto.imageKey;
60+
if (dto.imageKey) {
61+
blogpost.imageKey = dto.imageKey;
62+
}
5763
blogpost.title = dto.title;
64+
blogpost.shortDescription = dto.shortDescription;
5865

5966
return this.blogpostEntityRepository
6067
.save(blogpost)
@@ -68,10 +75,19 @@ export class BlogpostController {
6875
@CurrentUser() user: CurrentUserDto,
6976
@Param("id", ParseIntPipe) id: number,
7077
): Promise<BlogpostDto> {
71-
const blog = await this.blogpostEntityRepository.findOne({ where: { id } });
78+
const blog = await this.blogpostEntityRepository.findOneOrFail({
79+
where: { id },
80+
});
81+
82+
if (blog.published) return this.mapper.mapPost(blog);
7283

7384
blog.published = true;
7485
blog.publishedAt = new Date();
86+
await this.forumApi.forumControllerGetThreadForKey({
87+
threadType: ThreadType.BLOGPOST,
88+
externalId: blog.id.toString(),
89+
title: blog.title,
90+
});
7591
return this.blogpostEntityRepository.save(blog).then(this.mapper.mapPost);
7692
}
7793

@@ -80,7 +96,7 @@ export class BlogpostController {
8096
@Param("id", ParseIntPipe) id: number,
8197
): Promise<BlogpostDto> {
8298
return this.blogpostEntityRepository
83-
.findOne({
99+
.findOneOrFail({
84100
where: { id, published: true },
85101
})
86102
.then(this.mapper.mapPost);
@@ -94,7 +110,7 @@ export class BlogpostController {
94110
): Promise<BlogpostDto> {
95111
return this.blogpostEntityRepository
96112
.findOne({
97-
where: { id, published: false },
113+
where: { id },
98114
})
99115
.then(this.mapper.mapPost);
100116
}

src/rest/blogpost/blogpost.dto.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ export class UpdateBlogpostDraftDto {
77

88
content: string;
99
title: string;
10-
imageKey: string;
10+
shortDescription: string;
11+
imageKey?: string;
1112
}
1213

1314
export class BlogpostDto {
1415
id: number;
1516
content: string;
1617
title: string;
18+
shortDescription: string;
1719
image: UploadedImageDto;
1820

1921
published: boolean;

src/rest/blogpost/blogpost.mapper.ts

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export class BlogpostMapper {
1717
id: post.id,
1818
content: post.content,
1919
title: post.title,
20+
shortDescription: post.shortDescription,
2021
image: this.storageMapper.mapS3Item(post.imageKey),
2122

2223
published: post.published,

src/rest/forum/forum.controller.ts

+20
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ import { PlayerId } from "../../gateway/shared-types/player-id";
5959
import { ReqLoggingInterceptor } from "../../middleware/req-logging.interceptor";
6060
import { LiveMatchService } from "../../cache/live-match.service";
6161
import { WithOptionalUser } from "../../utils/decorator/with-optional-user";
62+
import { BlogpostEntity } from "../../entity/blogpost.entity";
63+
import { InjectRepository } from "@nestjs/typeorm";
64+
import { Repository } from "typeorm";
6265

6366
@UseInterceptors(ReqLoggingInterceptor)
6467
@Controller("forum")
@@ -71,6 +74,8 @@ export class ForumController {
7174
private readonly api: ForumApi,
7275
private readonly matchApi: MatchApi,
7376
private readonly liveMatchService: LiveMatchService,
77+
@InjectRepository(BlogpostEntity)
78+
private readonly blogpostEntityRepository: Repository<BlogpostEntity>,
7479
) {}
7580

7681
@ApiParam({
@@ -253,6 +258,21 @@ export class ForumController {
253258
return this.api
254259
.forumControllerGetThread(`${threadType}_${id}`)
255260
.then(this.mapper.mapThread);
261+
} else if (threadType === ThreadType.BLOGPOST) {
262+
await this.blogpostEntityRepository.findOneOrFail({
263+
where: {
264+
id: Number(id),
265+
published: true,
266+
},
267+
});
268+
return this.api
269+
.forumControllerGetThreadForKey({
270+
threadType: ThreadType.BLOGPOST,
271+
externalId: id,
272+
title: `Пост ${id}`,
273+
op: undefined, // Make player author of its own thread
274+
})
275+
.then(this.mapper.mapThread);
256276
} else if (threadType === ThreadType.LOBBY) {
257277
return this.api
258278
.forumControllerGetThreadForKey({

src/rest/storage/storage.controller.ts

+2
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ export class StorageController {
8888
Bucket: this.config.get("s3.bucket"),
8989
Prefix: this.config.get("s3.uploadPrefix"),
9090
ContinuationToken: ctoken,
91+
MaxKeys: 50,
9192
} satisfies ListObjectsV2CommandInput);
93+
console.log(response.KeyCount, response.Contents.length);
9294

9395
return {
9496
items: response.Contents.map((it) => it.Key).map(this.mapper.mapS3Item),

src/utils/logger.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export class WinstonWrapper implements LoggerService {
4949
}
5050

5151
error(message: any, ...optionalParams: any[]): any {
52-
console.trace(optionalParams[0]);
52+
console.trace(message, optionalParams[0]);
5353
this.winstonInstance.error(this.wrap(message, optionalParams[0]));
5454
}
5555

0 commit comments

Comments
 (0)