This repository has been archived by the owner on Feb 17, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 92
/
Copy pathmylist.js
187 lines (159 loc) · 4.9 KB
/
mylist.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
const _ = require('lodash');
const knex = require('./connect');
/**
* 创建收藏列表
* @param {String} username 用户名
* @param {String} mylistName 收藏列表名称
*/
const createMylist = (username, mylistName) => knex.transaction(async trx => {
const indexRes = await trx('t_mylist')
.insert({
user_name: username,
name: mylistName,
works: JSON.stringify(works)
});
const mylistId = indexRes[0];
return mylistId;
});
/**
* 删除收藏列表
* @param {String} username 用户名
* @param {Number} mylistId 收藏列表 id
*/
const deleteMylist = (username, mylistId) => knex.transaction(async trx => {
const deletedNum = await trx('t_mylist')
.where('user_name', '=', username)
.andWhere('id', '=', mylistId)
.del();
if (deletedNum === 0) {
throw new Error(`不存在 id 为 ${mylistId} 且属于用户 ${username} 的收藏列表.`);
}
return deletedNum;
});
/**
* 重命名收藏列表
* @param {String} username 用户名
* @param {Number} mylistId 收藏列表 id
* @param {String} username 收藏列表名称
*/
const renameMylist = (username, mylistId, mylistName) => knex.transaction(async trx => {
const updatedNum = await trx('t_mylist')
.where('id', '=', mylistId)
.andWhere('user_name', '=', username)
.update({
name: mylistName
});
if (updatedNum === 0) {
throw new Error(`不存在 id 为 ${mylistId} 且属于用户 ${username} 的收藏列表.`);
}
return updatedNum;
});
/**
* 获取用户的全部收藏列表
* @param {String} username 用户名
*/
const getMylists = async username => knex('t_mylist')
.select('id', 'name as mylist_name', 'works as mylist_works')
.where('user_name', '=', username);
/**
* 添加收藏列表音声
* @param {String} username 用户名
* @param {Number} mylistId 收藏列表 id
* @param {Number} workid 音声 id
*/
const addMylistWork = (username, mylistId, workid) => knex.transaction(async trx => {
const mylistRes = await trx('t_mylist')
.select('works')
.where('id', '=', mylistId)
.andWhere('user_name', '=', username)
.first();
if (!mylistRes) {
throw new Error(`不存在 id 为 ${mylistId} 且属于用户 ${username} 的收藏列表.`);
}
const works = JSON.parse(mylistRes.works);
const index = works.findIndex(work => work === workid);
if (index !== -1) {
throw new Error('不允许在收藏列表中添加重复的音声.');
}
try {
await trx('t_mylist_t_work_relation')
.insert({
mylist_id: mylistId,
work_id: workid
});
} catch (err) {
if (err.message.indexOf('FOREIGN KEY constraint failed') !== -1) {
throw new Error(`不存在 id 为 ${workid} 的音声.`);
} else {
throw err;
}
}
works.push(workid);
await trx('t_mylist')
.where('id', '=', mylistId)
.update({
works: JSON.stringify(works)
});
});
/**
* 删除收藏列表音声
* @param {String} username 用户名
* @param {Number} mylistId 收藏列表 id
* @param {Number} workid 音声 id
*/
const deleteMylistWork = (username, mylistId, workid) => knex.transaction(async trx => {
const mylistRes = await trx('t_mylist')
.select('works')
.where('id', '=', mylistId)
.andWhere('user_name', '=', username)
.first();
if (!mylistRes) {
throw new Error(`不存在 id 为 ${mylistId} 且属于用户 ${username} 的收藏列表.`);
}
const works = JSON.parse(mylistRes.works);
const index = works.findIndex(work => work === workid);
if (index === -1) {
throw new Error(`在 id 为 ${mylistId} 的收藏列表中, 不存在 id 为 ${workid} 的音声.`);
}
await trx('t_mylist_t_work_relation')
.where('mylist_id', '=', mylistId)
.andWhere('work_id', '=', workid)
.del();
works.splice(index, 1);
await trx('t_mylist')
.where('id', '=', mylistId)
.update({
works: JSON.stringify(works)
});
});
/**
* 排序收藏列表音声
* @param {String} username 用户名
* @param {Number} mylistId 收藏列表 id
* @param {Array} works 音声 id 数组
*/
const orderMylistWork = (username, mylistId, works) => knex.transaction(async trx => {
const mylistRes = await trx('t_mylist')
.select('works')
.where('id', '=', mylistId)
.andWhere('user_name', '=', username)
.first();
if (!mylistRes) {
throw new Error(`不存在 id 为 ${mylistId} 且属于用户 ${username} 的收藏列表.`);
}
const oldWorks = JSON.parse(mylistRes.works);
const oldWorksClone = _.cloneDeep(oldWorks);
const worksClone = _.cloneDeep(works);
if (!_.isEqual(oldWorksClone.sort(), worksClone.sort())) {
throw new Error('不允许在排序音声的同时添加或删除音声.');
}
await trx('t_mylist')
.where('id', '=', mylistId)
.update({
works: JSON.stringify(works)
});
});
module.exports = {
createMylist, deleteMylist, renameMylist, getMylists,
addMylistWork, deleteMylistWork, orderMylistWork
};