-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
91 lines (77 loc) · 2.36 KB
/
index.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
import express from "express";
import DecomojiAll from "decomoji/configs/v5_all.json" assert { type: "json" };
const PORT = process.env.PORT || 3000;
const isFalsyString = (v) => {
return v === "" || v === null || v === undefined;
};
// v5_all.json にカテゴリープロapティを加えたものをDBとする
const DecomojiDB = DecomojiAll.map((v) =>
v.path.match(/basic/)
? {
...v,
category: "basic",
}
: v.path.match(/explicit/)
? {
...v,
category: "explicit",
}
: v.path.match(/extra/)
? {
...v,
category: "extra",
}
: v
);
// query に対してマッチ
const matches = (
{
category: decomojiCategory,
created: decomojiCreated,
name: decomojiName,
updated: decomojiUpdated,
},
{
category: queryCategory,
created: queryCreated,
name: queryName,
updated: queryUpdated,
}
) => {
// 受け入れ可能なパラメータのいずれかが存在するか
const isValidParams =
queryCategory || queryCreated || queryName || queryUpdated;
// name パラメータが decomoji.name に正規表現で一致するか、または無効な指定か
const nameMatches =
RegExp(queryName).test(decomojiName) || isFalsyString(queryName);
// category パラメータが decomoji.category に一致するか、または無効な指定か
const categoryMatches =
queryCategory === decomojiCategory || isFalsyString(queryCategory);
// created パラメータが decomoji.created に一致するか、または無効な指定か
const createdMatches =
queryCreated === decomojiCreated || isFalsyString(queryCreated);
// updated パラメータが decomoji.updated に一致するか、または無効な指定か
const updatedMatches =
queryUpdated === decomojiUpdated || isFalsyString(queryUpdated);
return (
isValidParams &&
nameMatches &&
categoryMatches &&
createdMatches &&
updatedMatches
);
};
const app = express();
app.get("/search", (req, res) => {
const result = DecomojiDB.filter((v) => matches(v, req.query));
// key パラメータがあればその値のみ配列で返す
if (req.query.key) {
return res.json(result.map((v) => v[req.query.key]));
} else {
return res.json(result);
}
});
app.listen(PORT, () => {
console.log("listening decomoji-api server");
});
export default app;