feat: 新增剧集封面、集数管理与上传优化功能
1. 新增Cover实体类并注册到数据库模块 2. 为剧集添加总集数字段及自动创建集数槽功能 3. 新增管理员更新剧集集数接口 4. 优化发布剧集列表:支持标题过滤与默认分页大小10 5. 扩展MediaUploadJob实体字段,完善媒体上传流程 6. 重构订单与媒体服务,新增数据库持久化支持 7. 新增剧集标题过滤的端到端测试用例
This commit is contained in:
@@ -122,6 +122,89 @@ describe('Dramas and episodes', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('creates episode slots when a new drama declares total episodes', async () => {
|
||||
const drama = await request(app.getHttpServer())
|
||||
.post('/api/admin/v1/dramas')
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({
|
||||
title: 'Preconfigured Slots Drama',
|
||||
coverUrl: 'https://cdn.example.com/preconfigured-slots.jpg',
|
||||
type: 'romance',
|
||||
status: 'draft',
|
||||
totalEpisodes: 2,
|
||||
})
|
||||
.expect(201);
|
||||
|
||||
expect(drama.body.data).toMatchObject({
|
||||
title: 'Preconfigured Slots Drama',
|
||||
totalEpisodes: 2,
|
||||
publishedEpisodes: 0,
|
||||
});
|
||||
|
||||
const episodes = await request(app.getHttpServer())
|
||||
.get(`/api/admin/v1/dramas/${drama.body.data.id}/episodes`)
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.expect(200);
|
||||
|
||||
expect(episodes.body.data.list).toEqual([
|
||||
expect.objectContaining({
|
||||
dramaId: drama.body.data.id,
|
||||
episodeNo: 1,
|
||||
title: '第1集',
|
||||
publishStatus: 'draft',
|
||||
}),
|
||||
expect.objectContaining({
|
||||
dramaId: drama.body.data.id,
|
||||
episodeNo: 2,
|
||||
title: '第2集',
|
||||
publishStatus: 'draft',
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
it('updates an episode from the drama detail episodes endpoint', async () => {
|
||||
const drama = await request(app.getHttpServer())
|
||||
.post('/api/admin/v1/dramas')
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({
|
||||
title: 'Nested Episode Update Drama',
|
||||
coverUrl: 'https://cdn.example.com/nested-update.jpg',
|
||||
type: 'action',
|
||||
status: 'draft',
|
||||
totalEpisodes: 1,
|
||||
})
|
||||
.expect(201);
|
||||
|
||||
const episodes = await request(app.getHttpServer())
|
||||
.get(`/api/admin/v1/dramas/${drama.body.data.id}/episodes`)
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.expect(200);
|
||||
const episodeId = episodes.body.data.list[0].id;
|
||||
|
||||
const updated = await request(app.getHttpServer())
|
||||
.patch(`/api/admin/v1/dramas/${drama.body.data.id}/episodes/${episodeId}`)
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({
|
||||
title: 'Updated Nested Episode',
|
||||
description: 'Updated from drama detail.',
|
||||
durationSeconds: 240,
|
||||
freeType: 'paid',
|
||||
price: 199,
|
||||
})
|
||||
.expect(200);
|
||||
|
||||
expect(updated.body.data).toMatchObject({
|
||||
id: episodeId,
|
||||
dramaId: drama.body.data.id,
|
||||
title: 'Updated Nested Episode',
|
||||
description: 'Updated from drama detail.',
|
||||
durationSeconds: 240,
|
||||
freeType: 'paid',
|
||||
isPaid: true,
|
||||
price: 199,
|
||||
});
|
||||
});
|
||||
|
||||
it('returns only published dramas and published episodes to app APIs', async () => {
|
||||
const published = await request(app.getHttpServer())
|
||||
.post('/api/admin/v1/dramas')
|
||||
@@ -197,4 +280,45 @@ describe('Dramas and episodes', () => {
|
||||
}),
|
||||
]);
|
||||
});
|
||||
|
||||
it('filters published dramas by title and defaults app page size to 10', async () => {
|
||||
await request(app.getHttpServer())
|
||||
.post('/api/admin/v1/dramas')
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({
|
||||
title: 'Searchable Moon Drama',
|
||||
coverUrl: 'https://cdn.example.com/searchable-moon.jpg',
|
||||
type: 'romance',
|
||||
status: 'published',
|
||||
})
|
||||
.expect(201);
|
||||
|
||||
await request(app.getHttpServer())
|
||||
.post('/api/admin/v1/dramas')
|
||||
.set('Authorization', `Bearer ${adminToken}`)
|
||||
.send({
|
||||
title: 'Hidden Sun Drama',
|
||||
coverUrl: 'https://cdn.example.com/hidden-sun.jpg',
|
||||
type: 'romance',
|
||||
status: 'published',
|
||||
})
|
||||
.expect(201);
|
||||
|
||||
const response = await request(app.getHttpServer())
|
||||
.get('/api/app/v1/dramas')
|
||||
.query({ title: 'Moon' })
|
||||
.expect(200);
|
||||
|
||||
expect(response.body.data.pagination.pageSize).toBe(10);
|
||||
expect(response.body.data.list).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ title: 'Searchable Moon Drama' }),
|
||||
]),
|
||||
);
|
||||
expect(response.body.data.list).not.toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ title: 'Hidden Sun Drama' }),
|
||||
]),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user