-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnarou.ts
More file actions
150 lines (141 loc) · 3.95 KB
/
narou.ts
File metadata and controls
150 lines (141 loc) · 3.95 KB
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
import type { NarouRankingResult } from "./narou-ranking-results.js";
import NarouSearchResults from "./narou-search-results.js";
import type {
NarouSearchResult,
UserSearchResult,
} from "./narou-search-results.js";
import type {
RankingHistoryParams,
RankingParams,
SearchParams,
UserSearchParams,
} from "./params.js";
import type { RankingHistoryRawResult } from "./ranking-history.js";
/**
* なろう小説APIへのリクエストパラメータ
*/
export type NarouParams =
| SearchParams
| RankingParams
| RankingHistoryParams
| UserSearchParams;
export type ExecuteOptions = {
fetchOptions?: RequestInit;
};
/**
* なろう小説APIへのリクエストを実行する
* @class NarouNovel
* @private
*/
export default abstract class NarouNovel {
/**
* なろうAPIへのAPIリクエストを実行する
* @param params クエリパラメータ
* @param endpoint APIエンドポイント
* @returns 実行結果
*/
protected abstract execute<T>(
params: NarouParams,
endpoint: string,
options?: ExecuteOptions
): Promise<T>;
/**
* APIへの検索リクエストを実行する
* @param params クエリパラメータ
* @param endpoint APIエンドポイント
* @returns 検索結果
*/
protected async executeSearch<T extends keyof NarouSearchResult>(
params: SearchParams,
endpoint = "https://api.syosetu.com/novelapi/api/",
options?: ExecuteOptions
): Promise<NarouSearchResults<NarouSearchResult, T>> {
return new NarouSearchResults(
await this.execute(params, endpoint, options),
params
);
}
/**
* 小説APIへの検索リクエストを実行する
* @param params クエリパラメータ
* @returns 検索結果
* @see https://dev.syosetu.com/man/api/
*/
async executeNovel<T extends keyof NarouSearchResult>(
params: SearchParams,
options?: ExecuteOptions
): Promise<NarouSearchResults<NarouSearchResult, T>> {
return await this.executeSearch(
params,
"https://api.syosetu.com/novelapi/api/",
options
);
}
/**
* R18小説APIへの検索リクエストを実行する
* @param params クエリパラメータ
* @returns 検索結果
* @see https://dev.syosetu.com/xman/api/
*/
async executeNovel18<T extends keyof NarouSearchResult>(
params: SearchParams,
options?: ExecuteOptions
): Promise<NarouSearchResults<NarouSearchResult, T>> {
return await this.executeSearch(
params,
"https://api.syosetu.com/novel18api/api/",
options
);
}
/**
* ランキングAPIへのリクエストを実行する
* @param params クエリパラメータ
* @returns ランキング結果
* @see https://dev.syosetu.com/man/rankapi/
*/
async executeRanking(
params: RankingParams,
options?: ExecuteOptions
): Promise<NarouRankingResult[]> {
return await this.execute(
params,
"https://api.syosetu.com/rank/rankget/",
options
);
}
/**
* 殿堂入りAPiへのリクエストを実行する
* @param params クエリパラメータ
* @returns ランキング履歴結果
* @see https://dev.syosetu.com/man/rankinapi/
*/
async executeRankingHistory(
params: RankingHistoryParams,
options?: ExecuteOptions
): Promise<RankingHistoryRawResult[]> {
return await this.execute(
params,
"https://api.syosetu.com/rank/rankin/",
options
);
}
/**
* ユーザー検索APIへのリクエストを実行する
* @param params クエリパラメータ
* @returns 検索結果
* @see https://dev.syosetu.com/man/userapi/
*/
async executeUserSearch<T extends keyof UserSearchResult>(
params: UserSearchParams,
options?: ExecuteOptions
): Promise<NarouSearchResults<UserSearchResult, T>> {
return new NarouSearchResults<UserSearchResult, T>(
await this.execute(
params,
"https://api.syosetu.com/userapi/api/",
options
),
params
);
}
}