Skip to content
This repository was archived by the owner on Mar 3, 2020. It is now read-only.

Commit ea028ed

Browse files
committed
Implements series create and listing
1 parent 3114244 commit ea028ed

File tree

3 files changed

+76
-4
lines changed

3 files changed

+76
-4
lines changed

velog-backend/src/database/models/Series.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Sequelize from 'sequelize';
22
import db from 'database/db';
33
import { primaryUUID } from 'lib/common';
44
import { User } from 'database/models';
5+
import pick from 'lodash/pick';
56

67
const Series = db.define(
78
'series',
@@ -36,4 +37,19 @@ Series.associate = () => {
3637
});
3738
};
3839

40+
export const serializeSeries = data => ({
41+
...pick(data, [
42+
'id',
43+
'name',
44+
'description',
45+
'thumbnail',
46+
'url_slug',
47+
'created_at',
48+
]),
49+
user: {
50+
username: data.user.username,
51+
thumbnail: data.user.user_profile.thumbnail,
52+
},
53+
});
54+
3955
export default Series;

velog-backend/src/database/models/SeriesPosts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ SeriesPosts.associate = () => {
3434
},
3535
foreignKey: 'fk_post_id',
3636
});
37-
SeriesPosts.belongsTo(Post, {
37+
SeriesPosts.belongsTo(Series, {
3838
onDelete: 'CASCADE',
3939
onUpdate: 'Restrict',
4040
foreignKey: 'fk_series_id',

velog-backend/src/router/series/series.ctrl.js

Lines changed: 59 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
import type { Context } from 'koa';
33
import Joi from 'joi';
44
import { checkEmpty, validateSchema } from 'lib/common';
5-
import { Series } from 'database/models';
5+
import { UserProfile, User, Post } from 'database/models';
6+
import pick from 'lodash/pick';
67
import SeriesPosts from '../../database/models/SeriesPosts';
8+
import Series, { serializeSeries } from '../../database/models/Series';
79

810
const seriesPostSchema = Joi.object().keys({
911
id: Joi.string().required(),
@@ -75,6 +77,12 @@ async function updateSeriesPosts(seriesId: string, posts: SeriesPostInfo[]) {
7577
tasks.add.push(post);
7678
}
7779
});
80+
81+
const promises = [];
82+
tasks.add.forEach((a) => {
83+
promises.push(SeriesPosts.build({ ...a, fk_series_id: seriesId }).save());
84+
});
85+
await Promise.all(promises);
7886
} catch (e) {
7987
throw e;
8088
}
@@ -133,6 +141,11 @@ export const createSeries = async (ctx: Context) => {
133141
url_slug,
134142
fk_user_id: ctx.user.id,
135143
}).save();
144+
145+
await updateSeriesPosts(
146+
series.id,
147+
posts.map(p => ({ fk_post_id: p.id, index: p.index })),
148+
);
136149
ctx.body = {
137150
id: series.id,
138151
name,
@@ -144,8 +157,51 @@ export const createSeries = async (ctx: Context) => {
144157
ctx.throw(500, e);
145158
}
146159
};
147-
export const listSeries = async (ctx: Context) => {};
148-
export const getSeries = async (ctx: Context) => {};
160+
export const listSeries = async (ctx: Context) => {
161+
try {
162+
const seriesList = await Series.findAll({
163+
limit: 20,
164+
include: [
165+
{
166+
model: User,
167+
include: [UserProfile],
168+
},
169+
],
170+
});
171+
ctx.body = seriesList.map(serializeSeries);
172+
} catch (e) {
173+
ctx.throw(500, e);
174+
}
175+
};
176+
export const getSeries = async (ctx: Context) => {
177+
const { urlSlug, username } = ctx.params;
178+
try {
179+
const series = await Series.findOne({
180+
include: [
181+
{
182+
model: User,
183+
include: [UserProfile],
184+
where: {
185+
username,
186+
},
187+
},
188+
// Post,
189+
],
190+
where: {
191+
url_slug: urlSlug,
192+
},
193+
});
194+
if (!series) {
195+
ctx.status = 404;
196+
return;
197+
}
198+
const serialized = serializeSeries(series);
199+
serialized.posts = series.posts;
200+
ctx.body = serialized;
201+
} catch (e) {
202+
ctx.throw(500, e);
203+
}
204+
};
149205

150206
export const updateSeries = async (ctx: Context) => {
151207
/*

0 commit comments

Comments
 (0)