@kajidog/connpass-api-client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCE +21 -0
- package/README.md +184 -0
- package/dist/application/ConnpassClient.d.ts +41 -0
- package/dist/application/ConnpassClient.d.ts.map +1 -0
- package/dist/application/ConnpassClient.js +108 -0
- package/dist/application/ConnpassClient.js.map +1 -0
- package/dist/application/services/EventService.d.ts +10 -0
- package/dist/application/services/EventService.d.ts.map +1 -0
- package/dist/application/services/EventService.js +45 -0
- package/dist/application/services/EventService.js.map +1 -0
- package/dist/application/services/GroupService.d.ts +9 -0
- package/dist/application/services/GroupService.d.ts.map +1 -0
- package/dist/application/services/GroupService.js +39 -0
- package/dist/application/services/GroupService.js.map +1 -0
- package/dist/application/services/UserService.d.ts +25 -0
- package/dist/application/services/UserService.d.ts.map +1 -0
- package/dist/application/services/UserService.js +76 -0
- package/dist/application/services/UserService.js.map +1 -0
- package/dist/application/services/index.d.ts +4 -0
- package/dist/application/services/index.d.ts.map +1 -0
- package/dist/application/services/index.js +20 -0
- package/dist/application/services/index.js.map +1 -0
- package/dist/domain/entities/Event.d.ts +46 -0
- package/dist/domain/entities/Event.d.ts.map +1 -0
- package/dist/domain/entities/Event.js +3 -0
- package/dist/domain/entities/Event.js.map +1 -0
- package/dist/domain/entities/Group.d.ts +28 -0
- package/dist/domain/entities/Group.d.ts.map +1 -0
- package/dist/domain/entities/Group.js +3 -0
- package/dist/domain/entities/Group.js.map +1 -0
- package/dist/domain/entities/Presentation.d.ts +17 -0
- package/dist/domain/entities/Presentation.d.ts.map +1 -0
- package/dist/domain/entities/Presentation.js +3 -0
- package/dist/domain/entities/Presentation.js.map +1 -0
- package/dist/domain/entities/User.d.ts +23 -0
- package/dist/domain/entities/User.d.ts.map +1 -0
- package/dist/domain/entities/User.js +3 -0
- package/dist/domain/entities/User.js.map +1 -0
- package/dist/domain/entities/index.d.ts +5 -0
- package/dist/domain/entities/index.d.ts.map +1 -0
- package/dist/domain/entities/index.js +21 -0
- package/dist/domain/entities/index.js.map +1 -0
- package/dist/domain/errors/ConnpassError.d.ts +18 -0
- package/dist/domain/errors/ConnpassError.d.ts.map +1 -0
- package/dist/domain/errors/ConnpassError.js +46 -0
- package/dist/domain/errors/ConnpassError.js.map +1 -0
- package/dist/domain/errors/index.d.ts +2 -0
- package/dist/domain/errors/index.d.ts.map +1 -0
- package/dist/domain/errors/index.js +18 -0
- package/dist/domain/errors/index.js.map +1 -0
- package/dist/domain/repositories/IEventRepository.d.ts +6 -0
- package/dist/domain/repositories/IEventRepository.d.ts.map +1 -0
- package/dist/domain/repositories/IEventRepository.js +3 -0
- package/dist/domain/repositories/IEventRepository.js.map +1 -0
- package/dist/domain/repositories/IGroupRepository.d.ts +5 -0
- package/dist/domain/repositories/IGroupRepository.d.ts.map +1 -0
- package/dist/domain/repositories/IGroupRepository.js +3 -0
- package/dist/domain/repositories/IGroupRepository.js.map +1 -0
- package/dist/domain/repositories/IUserRepository.d.ts +19 -0
- package/dist/domain/repositories/IUserRepository.d.ts.map +1 -0
- package/dist/domain/repositories/IUserRepository.js +3 -0
- package/dist/domain/repositories/IUserRepository.js.map +1 -0
- package/dist/domain/repositories/index.d.ts +4 -0
- package/dist/domain/repositories/index.d.ts.map +1 -0
- package/dist/domain/repositories/index.js +20 -0
- package/dist/domain/repositories/index.js.map +1 -0
- package/dist/domain/utils/validators.d.ts +9 -0
- package/dist/domain/utils/validators.d.ts.map +1 -0
- package/dist/domain/utils/validators.js +76 -0
- package/dist/domain/utils/validators.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/cache/PresentationCache.d.ts +20 -0
- package/dist/infrastructure/cache/PresentationCache.d.ts.map +1 -0
- package/dist/infrastructure/cache/PresentationCache.js +91 -0
- package/dist/infrastructure/cache/PresentationCache.js.map +1 -0
- package/dist/infrastructure/http/HttpClient.d.ts +17 -0
- package/dist/infrastructure/http/HttpClient.d.ts.map +1 -0
- package/dist/infrastructure/http/HttpClient.js +75 -0
- package/dist/infrastructure/http/HttpClient.js.map +1 -0
- package/dist/infrastructure/repositories/EventRepository.d.ts +14 -0
- package/dist/infrastructure/repositories/EventRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/EventRepository.js +117 -0
- package/dist/infrastructure/repositories/EventRepository.js.map +1 -0
- package/dist/infrastructure/repositories/GroupRepository.d.ts +10 -0
- package/dist/infrastructure/repositories/GroupRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/GroupRepository.js +35 -0
- package/dist/infrastructure/repositories/GroupRepository.js.map +1 -0
- package/dist/infrastructure/repositories/UserRepository.d.ts +24 -0
- package/dist/infrastructure/repositories/UserRepository.d.ts.map +1 -0
- package/dist/infrastructure/repositories/UserRepository.js +68 -0
- package/dist/infrastructure/repositories/UserRepository.js.map +1 -0
- package/dist/infrastructure/repositories/index.d.ts +4 -0
- package/dist/infrastructure/repositories/index.d.ts.map +1 -0
- package/dist/infrastructure/repositories/index.js +20 -0
- package/dist/infrastructure/repositories/index.js.map +1 -0
- package/package.json +51 -0
package/LICENCE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 kajidog
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Connpass API Client
|
|
2
|
+
|
|
3
|
+
TypeScript client for Connpass API v2 with clean architecture design.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm install @kajidog/connpass-api-client
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
### Basic Usage
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { ConnpassClient } from '@kajidog/connpass-api-client';
|
|
17
|
+
|
|
18
|
+
const client = new ConnpassClient({
|
|
19
|
+
apiKey: 'your-api-key-here'
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
// Search for events
|
|
23
|
+
const events = await client.searchEvents({
|
|
24
|
+
keyword: 'TypeScript',
|
|
25
|
+
count: 10
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
console.log(events.events);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Configuration Options
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
const client = new ConnpassClient({
|
|
35
|
+
apiKey: 'your-api-key-here',
|
|
36
|
+
baseURL: 'https://connpass.com/api/v2', // optional, default value
|
|
37
|
+
timeout: 30000, // optional, default 30 seconds
|
|
38
|
+
rateLimitDelay: 1000, // optional, default 1 second between requests
|
|
39
|
+
enablePresentationCache: true, // optional, default true
|
|
40
|
+
presentationCacheTtlMs: 1000 * 60 * 60, // optional, default 1 hour
|
|
41
|
+
presentationCachePath: './data/presentation-cache.json' // optional, default cwd/data
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
If these options are omitted, the client falls back to environment variables:
|
|
46
|
+
|
|
47
|
+
- `CONNPASS_PRESENTATION_CACHE_ENABLED` (`true`/`false`, defaults to `true`)
|
|
48
|
+
- `CONNPASS_PRESENTATION_CACHE_TTL_MS` (millisecond TTL, defaults to `3600000`)
|
|
49
|
+
- `CONNPASS_PRESENTATION_CACHE_PATH` (path to persistent cache file, defaults to `./data/presentation-cache.json`)
|
|
50
|
+
|
|
51
|
+
### Available Methods
|
|
52
|
+
|
|
53
|
+
#### Events
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Search events with pagination
|
|
57
|
+
const events = await client.searchEvents({
|
|
58
|
+
keyword: 'JavaScript',
|
|
59
|
+
ymdFrom: '2024-01-01',
|
|
60
|
+
ymdTo: '2024-12-31',
|
|
61
|
+
count: 20,
|
|
62
|
+
start: 1
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// Get all events (automatically handles pagination)
|
|
66
|
+
const allEvents = await client.getAllEvents({
|
|
67
|
+
keyword: 'React'
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Get event presentations
|
|
71
|
+
const presentations = await client.getEventPresentations(12345);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
#### Groups
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// Search groups
|
|
78
|
+
const groups = await client.searchGroups({
|
|
79
|
+
keyword: 'JavaScript',
|
|
80
|
+
prefecture: '東京都'
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Get all groups
|
|
84
|
+
const allGroups = await client.getAllGroups({
|
|
85
|
+
keyword: 'TypeScript'
|
|
86
|
+
});
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### Users
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// Search users
|
|
93
|
+
const users = await client.searchUsers({
|
|
94
|
+
nickname: 'example_user'
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Get user's groups
|
|
98
|
+
const userGroups = await client.getUserGroups(12345);
|
|
99
|
+
|
|
100
|
+
// Get user's attended events
|
|
101
|
+
const attendedEvents = await client.getUserAttendedEvents(12345);
|
|
102
|
+
const sameResult = await client.getUserAttendedEvents('kajidog');
|
|
103
|
+
|
|
104
|
+
// Get user's presenter events
|
|
105
|
+
const presenterEvents = await client.getUserPresenterEvents(12345);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Error Handling
|
|
109
|
+
|
|
110
|
+
The client provides specific error types for different scenarios:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
import {
|
|
114
|
+
ConnpassError,
|
|
115
|
+
ConnpassApiError,
|
|
116
|
+
ConnpassRateLimitError,
|
|
117
|
+
ConnpassValidationError,
|
|
118
|
+
ConnpassTimeoutError
|
|
119
|
+
} from '@kajidog/connpass-api-client';
|
|
120
|
+
|
|
121
|
+
try {
|
|
122
|
+
const events = await client.searchEvents({ keyword: 'TypeScript' });
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (error instanceof ConnpassRateLimitError) {
|
|
125
|
+
console.log('Rate limit exceeded, please wait');
|
|
126
|
+
} else if (error instanceof ConnpassValidationError) {
|
|
127
|
+
console.log('Invalid parameters:', error.message);
|
|
128
|
+
} else if (error instanceof ConnpassApiError) {
|
|
129
|
+
console.log('API error:', error.statusCode, error.message);
|
|
130
|
+
} else if (error instanceof ConnpassTimeoutError) {
|
|
131
|
+
console.log('Request timeout');
|
|
132
|
+
} else {
|
|
133
|
+
console.log('Unknown error:', error.message);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Search Parameters
|
|
139
|
+
|
|
140
|
+
#### Event Search Parameters
|
|
141
|
+
|
|
142
|
+
- `eventId`: Array of event IDs
|
|
143
|
+
- `keyword`: Search keyword (AND search)
|
|
144
|
+
- `keywordOr`: Search keyword (OR search)
|
|
145
|
+
- `ymdFrom`: Start date (YYYY-MM-DD format)
|
|
146
|
+
- `ymdTo`: End date (YYYY-MM-DD format)
|
|
147
|
+
- `nickname`: Participant nickname
|
|
148
|
+
- `ownerNickname`: Event owner nickname
|
|
149
|
+
- `groupId`: Array of group IDs
|
|
150
|
+
- `count`: Number of results (1-100, default 10)
|
|
151
|
+
- `order`: Sort order (1: updated_at desc, 2: started_at asc, 3: started_at desc)
|
|
152
|
+
- `start`: Start position for pagination
|
|
153
|
+
|
|
154
|
+
#### Group Search Parameters
|
|
155
|
+
|
|
156
|
+
- `groupId`: Array of group IDs
|
|
157
|
+
- `keyword`: Search keyword
|
|
158
|
+
- `countryCode`: Country code
|
|
159
|
+
- `prefecture`: Prefecture
|
|
160
|
+
- `count`: Number of results (1-100, default 10)
|
|
161
|
+
- `order`: Sort order
|
|
162
|
+
- `start`: Start position for pagination
|
|
163
|
+
|
|
164
|
+
#### User Search Parameters
|
|
165
|
+
|
|
166
|
+
- `userId`: Array of user IDs
|
|
167
|
+
- `nickname`: User nickname
|
|
168
|
+
- `count`: Number of results (1-100, default 10)
|
|
169
|
+
- `order`: Sort order
|
|
170
|
+
- `start`: Start position for pagination
|
|
171
|
+
|
|
172
|
+
## Features
|
|
173
|
+
|
|
174
|
+
- ✅ Full TypeScript support with comprehensive type definitions
|
|
175
|
+
- ✅ Rate limiting built-in (1 request per second)
|
|
176
|
+
- ✅ Automatic pagination support with `getAll*` methods
|
|
177
|
+
- ✅ Comprehensive error handling with specific error types
|
|
178
|
+
- ✅ Input validation
|
|
179
|
+
- ✅ Clean architecture design
|
|
180
|
+
- ✅ Easy to test and extend
|
|
181
|
+
|
|
182
|
+
## License
|
|
183
|
+
|
|
184
|
+
MIT
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EventSearchParams, EventsResponse, PresentationsResponse, GroupSearchParams, GroupsResponse, UserSearchParams, UsersResponse } from '../domain/entities';
|
|
2
|
+
export interface ConnpassClientConfig {
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseURL?: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
rateLimitDelay?: number;
|
|
7
|
+
enablePresentationCache?: boolean;
|
|
8
|
+
presentationCacheTtlMs?: number;
|
|
9
|
+
presentationCachePath?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class ConnpassClient {
|
|
12
|
+
private readonly eventService;
|
|
13
|
+
private readonly groupService;
|
|
14
|
+
private readonly userService;
|
|
15
|
+
constructor(config: ConnpassClientConfig);
|
|
16
|
+
searchEvents(params?: EventSearchParams): Promise<EventsResponse>;
|
|
17
|
+
getAllEvents(params?: Omit<EventSearchParams, 'start' | 'count'>): Promise<EventsResponse>;
|
|
18
|
+
getEventPresentations(eventId: number): Promise<PresentationsResponse>;
|
|
19
|
+
searchGroups(params?: GroupSearchParams): Promise<GroupsResponse>;
|
|
20
|
+
getAllGroups(params?: Omit<GroupSearchParams, 'start' | 'count'>): Promise<GroupsResponse>;
|
|
21
|
+
searchUsers(params?: UserSearchParams): Promise<UsersResponse>;
|
|
22
|
+
getAllUsers(params?: Omit<UserSearchParams, 'start' | 'count'>): Promise<UsersResponse>;
|
|
23
|
+
getUserGroups(userIdOrNickname: number | string, params?: {
|
|
24
|
+
count?: number;
|
|
25
|
+
start?: number;
|
|
26
|
+
}): Promise<GroupsResponse>;
|
|
27
|
+
getUserAttendedEvents(userIdOrNickname: number | string, params?: {
|
|
28
|
+
count?: number;
|
|
29
|
+
order?: 1 | 2 | 3;
|
|
30
|
+
start?: number;
|
|
31
|
+
}): Promise<EventsResponse>;
|
|
32
|
+
getUserPresenterEvents(userIdOrNickname: number | string, params?: {
|
|
33
|
+
count?: number;
|
|
34
|
+
order?: 1 | 2 | 3;
|
|
35
|
+
start?: number;
|
|
36
|
+
}): Promise<EventsResponse>;
|
|
37
|
+
private resolveCacheEnabled;
|
|
38
|
+
private resolveCacheTtl;
|
|
39
|
+
private resolveCachePath;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=ConnpassClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnpassClient.d.ts","sourceRoot":"","sources":["../../src/application/ConnpassClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;gBAE9B,MAAM,EAAE,oBAAoB;IA2BlC,YAAY,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrE,YAAY,CAAC,MAAM,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAI9F,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAItE,YAAY,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrE,YAAY,CAAC,MAAM,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAI9F,WAAW,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE,WAAW,CAAC,MAAM,GAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAI3F,aAAa,CACjB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,cAAc,CAAC;IAIpB,qBAAqB,CACzB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,cAAc,CAAC;IAIpB,sBAAsB,CAC1B,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,cAAc,CAAC;IAI1B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,gBAAgB;CAYzB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConnpassClient = void 0;
|
|
7
|
+
const path_1 = __importDefault(require("path"));
|
|
8
|
+
const HttpClient_1 = require("../infrastructure/http/HttpClient");
|
|
9
|
+
const repositories_1 = require("../infrastructure/repositories");
|
|
10
|
+
const services_1 = require("./services");
|
|
11
|
+
const PresentationCache_1 = require("../infrastructure/cache/PresentationCache");
|
|
12
|
+
class ConnpassClient {
|
|
13
|
+
constructor(config) {
|
|
14
|
+
if (!config.apiKey) {
|
|
15
|
+
throw new Error('API key is required');
|
|
16
|
+
}
|
|
17
|
+
const httpClient = new HttpClient_1.HttpClient({
|
|
18
|
+
baseURL: config.baseURL ?? 'https://connpass.com/api/v2',
|
|
19
|
+
apiKey: config.apiKey,
|
|
20
|
+
timeout: config.timeout,
|
|
21
|
+
rateLimitDelay: config.rateLimitDelay,
|
|
22
|
+
});
|
|
23
|
+
const presentationCache = new PresentationCache_1.PresentationCache({
|
|
24
|
+
enabled: this.resolveCacheEnabled(config.enablePresentationCache),
|
|
25
|
+
ttlMs: this.resolveCacheTtl(config.presentationCacheTtlMs),
|
|
26
|
+
filePath: this.resolveCachePath(config.presentationCachePath),
|
|
27
|
+
});
|
|
28
|
+
const eventRepository = new repositories_1.EventRepository(httpClient, presentationCache);
|
|
29
|
+
const groupRepository = new repositories_1.GroupRepository(httpClient);
|
|
30
|
+
const userRepository = new repositories_1.UserRepository(httpClient);
|
|
31
|
+
this.eventService = new services_1.EventService(eventRepository);
|
|
32
|
+
this.groupService = new services_1.GroupService(groupRepository);
|
|
33
|
+
this.userService = new services_1.UserService(userRepository);
|
|
34
|
+
}
|
|
35
|
+
async searchEvents(params = {}) {
|
|
36
|
+
return this.eventService.searchEvents(params);
|
|
37
|
+
}
|
|
38
|
+
async getAllEvents(params = {}) {
|
|
39
|
+
return this.eventService.getAllEvents(params);
|
|
40
|
+
}
|
|
41
|
+
async getEventPresentations(eventId) {
|
|
42
|
+
return this.eventService.getEventPresentations(eventId);
|
|
43
|
+
}
|
|
44
|
+
async searchGroups(params = {}) {
|
|
45
|
+
return this.groupService.searchGroups(params);
|
|
46
|
+
}
|
|
47
|
+
async getAllGroups(params = {}) {
|
|
48
|
+
return this.groupService.getAllGroups(params);
|
|
49
|
+
}
|
|
50
|
+
async searchUsers(params = {}) {
|
|
51
|
+
return this.userService.searchUsers(params);
|
|
52
|
+
}
|
|
53
|
+
async getAllUsers(params = {}) {
|
|
54
|
+
return this.userService.getAllUsers(params);
|
|
55
|
+
}
|
|
56
|
+
async getUserGroups(userIdOrNickname, params) {
|
|
57
|
+
return this.userService.getUserGroups(userIdOrNickname, params);
|
|
58
|
+
}
|
|
59
|
+
async getUserAttendedEvents(userIdOrNickname, params) {
|
|
60
|
+
return this.userService.getUserAttendedEvents(userIdOrNickname, params);
|
|
61
|
+
}
|
|
62
|
+
async getUserPresenterEvents(userIdOrNickname, params) {
|
|
63
|
+
return this.userService.getUserPresenterEvents(userIdOrNickname, params);
|
|
64
|
+
}
|
|
65
|
+
resolveCacheEnabled(explicit) {
|
|
66
|
+
if (typeof explicit === 'boolean') {
|
|
67
|
+
return explicit;
|
|
68
|
+
}
|
|
69
|
+
const raw = process.env.CONNPASS_PRESENTATION_CACHE_ENABLED;
|
|
70
|
+
if (raw === undefined) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
const normalized = raw.trim().toLowerCase();
|
|
74
|
+
if (["1", "true", "yes", "y", "on"].includes(normalized)) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
if (["0", "false", "no", "n", "off"].includes(normalized)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
resolveCacheTtl(explicit) {
|
|
83
|
+
if (typeof explicit === 'number' && explicit >= 0) {
|
|
84
|
+
return explicit;
|
|
85
|
+
}
|
|
86
|
+
const fromEnv = process.env.CONNPASS_PRESENTATION_CACHE_TTL_MS;
|
|
87
|
+
if (fromEnv) {
|
|
88
|
+
const parsed = Number(fromEnv);
|
|
89
|
+
if (Number.isFinite(parsed) && parsed >= 0) {
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// default: 1 hour
|
|
94
|
+
return 60 * 60 * 1000;
|
|
95
|
+
}
|
|
96
|
+
resolveCachePath(explicit) {
|
|
97
|
+
if (explicit?.trim()) {
|
|
98
|
+
return explicit;
|
|
99
|
+
}
|
|
100
|
+
const fromEnv = process.env.CONNPASS_PRESENTATION_CACHE_PATH;
|
|
101
|
+
if (fromEnv?.trim()) {
|
|
102
|
+
return fromEnv;
|
|
103
|
+
}
|
|
104
|
+
return path_1.default.join(process.cwd(), 'data', 'presentation-cache.json');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.ConnpassClient = ConnpassClient;
|
|
108
|
+
//# sourceMappingURL=ConnpassClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnpassClient.js","sourceRoot":"","sources":["../../src/application/ConnpassClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { IEventRepository } from '../../domain/repositories';
|
|
2
|
+
import { EventSearchParams, EventsResponse, PresentationsResponse } from '../../domain/entities';
|
|
3
|
+
export declare class EventService {
|
|
4
|
+
private eventRepository;
|
|
5
|
+
constructor(eventRepository: IEventRepository);
|
|
6
|
+
searchEvents(params?: EventSearchParams): Promise<EventsResponse>;
|
|
7
|
+
getEventPresentations(eventId: number): Promise<PresentationsResponse>;
|
|
8
|
+
getAllEvents(params?: Omit<EventSearchParams, 'start' | 'count'>): Promise<EventsResponse>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=EventService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventService.d.ts","sourceRoot":"","sources":["../../../src/application/services/EventService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEjG,qBAAa,YAAY;IACX,OAAO,CAAC,eAAe;gBAAf,eAAe,EAAE,gBAAgB;IAE/C,YAAY,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrE,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAOtE,YAAY,CAAC,MAAM,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAkCrG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventService = void 0;
|
|
4
|
+
class EventService {
|
|
5
|
+
constructor(eventRepository) {
|
|
6
|
+
this.eventRepository = eventRepository;
|
|
7
|
+
}
|
|
8
|
+
async searchEvents(params = {}) {
|
|
9
|
+
return this.eventRepository.searchEvents(params);
|
|
10
|
+
}
|
|
11
|
+
async getEventPresentations(eventId) {
|
|
12
|
+
if (eventId <= 0) {
|
|
13
|
+
throw new Error('Event ID must be a positive number');
|
|
14
|
+
}
|
|
15
|
+
return this.eventRepository.getEventPresentations(eventId);
|
|
16
|
+
}
|
|
17
|
+
async getAllEvents(params = {}) {
|
|
18
|
+
const allEvents = {
|
|
19
|
+
eventsReturned: 0,
|
|
20
|
+
eventsAvailable: 0,
|
|
21
|
+
eventsStart: 1,
|
|
22
|
+
events: [],
|
|
23
|
+
};
|
|
24
|
+
let start = 1;
|
|
25
|
+
const count = 100;
|
|
26
|
+
while (true) {
|
|
27
|
+
const response = await this.searchEvents({ ...params, start, count });
|
|
28
|
+
if (allEvents.eventsAvailable === 0) {
|
|
29
|
+
allEvents.eventsAvailable = response.eventsAvailable;
|
|
30
|
+
allEvents.eventsStart = response.eventsStart;
|
|
31
|
+
}
|
|
32
|
+
allEvents.events.push(...response.events);
|
|
33
|
+
allEvents.eventsReturned += response.eventsReturned;
|
|
34
|
+
if (response.eventsReturned < count || allEvents.events.length >= response.eventsAvailable) {
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
start += count;
|
|
38
|
+
// Wait 1 second to respect API rate limit (1 request per second)
|
|
39
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
40
|
+
}
|
|
41
|
+
return allEvents;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.EventService = EventService;
|
|
45
|
+
//# sourceMappingURL=EventService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventService.js","sourceRoot":"","sources":["../../../src/application/services/EventService.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IACvB,YAAoB,eAAiC;QAAjC,oBAAe,GAAf,eAAe,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,YAAY,CAAC,SAA4B,EAAE;QAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAe;QACzC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAqD,EAAE;QACxE,MAAM,SAAS,GAAmB;YAChC,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,GAAG,CAAC;QAElB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAEtE,IAAI,SAAS,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;gBACpC,SAAS,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;gBACrD,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC/C,CAAC;YAED,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,SAAS,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC;YAEpD,IAAI,QAAQ,CAAC,cAAc,GAAG,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAC3F,MAAM;YACR,CAAC;YAED,KAAK,IAAI,KAAK,CAAC;YAEf,iEAAiE;YACjE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAhDD,oCAgDC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { IGroupRepository } from '../../domain/repositories';
|
|
2
|
+
import { GroupSearchParams, GroupsResponse } from '../../domain/entities';
|
|
3
|
+
export declare class GroupService {
|
|
4
|
+
private groupRepository;
|
|
5
|
+
constructor(groupRepository: IGroupRepository);
|
|
6
|
+
searchGroups(params?: GroupSearchParams): Promise<GroupsResponse>;
|
|
7
|
+
getAllGroups(params?: Omit<GroupSearchParams, 'start' | 'count'>): Promise<GroupsResponse>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=GroupService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupService.d.ts","sourceRoot":"","sources":["../../../src/application/services/GroupService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE1E,qBAAa,YAAY;IACX,OAAO,CAAC,eAAe;gBAAf,eAAe,EAAE,gBAAgB;IAE/C,YAAY,CAAC,MAAM,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,CAAC;IAIrE,YAAY,CAAC,MAAM,GAAE,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAkCrG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GroupService = void 0;
|
|
4
|
+
class GroupService {
|
|
5
|
+
constructor(groupRepository) {
|
|
6
|
+
this.groupRepository = groupRepository;
|
|
7
|
+
}
|
|
8
|
+
async searchGroups(params = {}) {
|
|
9
|
+
return this.groupRepository.searchGroups(params);
|
|
10
|
+
}
|
|
11
|
+
async getAllGroups(params = {}) {
|
|
12
|
+
const allGroups = {
|
|
13
|
+
groupsReturned: 0,
|
|
14
|
+
groupsAvailable: 0,
|
|
15
|
+
groupsStart: 1,
|
|
16
|
+
groups: [],
|
|
17
|
+
};
|
|
18
|
+
let start = 1;
|
|
19
|
+
const count = 100;
|
|
20
|
+
while (true) {
|
|
21
|
+
const response = await this.searchGroups({ ...params, start, count });
|
|
22
|
+
if (allGroups.groupsAvailable === 0) {
|
|
23
|
+
allGroups.groupsAvailable = response.groupsAvailable;
|
|
24
|
+
allGroups.groupsStart = response.groupsStart;
|
|
25
|
+
}
|
|
26
|
+
allGroups.groups.push(...response.groups);
|
|
27
|
+
allGroups.groupsReturned += response.groupsReturned;
|
|
28
|
+
if (response.groupsReturned < count || allGroups.groups.length >= response.groupsAvailable) {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
start += count;
|
|
32
|
+
// Wait 1 second to respect API rate limit (1 request per second)
|
|
33
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
34
|
+
}
|
|
35
|
+
return allGroups;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.GroupService = GroupService;
|
|
39
|
+
//# sourceMappingURL=GroupService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupService.js","sourceRoot":"","sources":["../../../src/application/services/GroupService.ts"],"names":[],"mappings":";;;AAGA,MAAa,YAAY;IACvB,YAAoB,eAAiC;QAAjC,oBAAe,GAAf,eAAe,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,YAAY,CAAC,SAA4B,EAAE;QAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAqD,EAAE;QACxE,MAAM,SAAS,GAAmB;YAChC,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,EAAE;SACX,CAAC;QAEF,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,MAAM,KAAK,GAAG,GAAG,CAAC;QAElB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAEtE,IAAI,SAAS,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;gBACpC,SAAS,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC;gBACrD,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YAC/C,CAAC;YAED,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC1C,SAAS,CAAC,cAAc,IAAI,QAAQ,CAAC,cAAc,CAAC;YAEpD,IAAI,QAAQ,CAAC,cAAc,GAAG,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,CAAC;gBAC3F,MAAM;YACR,CAAC;YAED,KAAK,IAAI,KAAK,CAAC;YAEf,iEAAiE;YACjE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAzCD,oCAyCC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IUserRepository } from '../../domain/repositories';
|
|
2
|
+
import { UserSearchParams, UsersResponse, GroupsResponse, EventsResponse } from '../../domain/entities';
|
|
3
|
+
export declare class UserService {
|
|
4
|
+
private userRepository;
|
|
5
|
+
private readonly nicknameCache;
|
|
6
|
+
constructor(userRepository: IUserRepository);
|
|
7
|
+
searchUsers(params?: UserSearchParams): Promise<UsersResponse>;
|
|
8
|
+
getUserGroups(userIdOrNickname: number | string, params?: {
|
|
9
|
+
count?: number;
|
|
10
|
+
start?: number;
|
|
11
|
+
}): Promise<GroupsResponse>;
|
|
12
|
+
getUserAttendedEvents(userIdOrNickname: number | string, params?: {
|
|
13
|
+
count?: number;
|
|
14
|
+
order?: 1 | 2 | 3;
|
|
15
|
+
start?: number;
|
|
16
|
+
}): Promise<EventsResponse>;
|
|
17
|
+
getUserPresenterEvents(userIdOrNickname: number | string, params?: {
|
|
18
|
+
count?: number;
|
|
19
|
+
order?: 1 | 2 | 3;
|
|
20
|
+
start?: number;
|
|
21
|
+
}): Promise<EventsResponse>;
|
|
22
|
+
getAllUsers(params?: Omit<UserSearchParams, 'start' | 'count'>): Promise<UsersResponse>;
|
|
23
|
+
private resolveUserNickname;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=UserService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserService.d.ts","sourceRoot":"","sources":["../../../src/application/services/UserService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAExG,qBAAa,WAAW;IAGV,OAAO,CAAC,cAAc;IAFlC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;gBAEvC,cAAc,EAAE,eAAe;IAE7C,WAAW,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAIlE,aAAa,CACjB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC,cAAc,CAAC;IAKpB,qBAAqB,CACzB,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,cAAc,CAAC;IAKpB,sBAAsB,CAC1B,gBAAgB,EAAE,MAAM,GAAG,MAAM,EACjC,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,cAAc,CAAC;IAKpB,WAAW,CAAC,MAAM,GAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAmCnF,mBAAmB;CA6BlC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserService = void 0;
|
|
4
|
+
class UserService {
|
|
5
|
+
constructor(userRepository) {
|
|
6
|
+
this.userRepository = userRepository;
|
|
7
|
+
this.nicknameCache = new Map();
|
|
8
|
+
}
|
|
9
|
+
async searchUsers(params = {}) {
|
|
10
|
+
return this.userRepository.searchUsers(params);
|
|
11
|
+
}
|
|
12
|
+
async getUserGroups(userIdOrNickname, params) {
|
|
13
|
+
const nickname = await this.resolveUserNickname(userIdOrNickname);
|
|
14
|
+
return this.userRepository.getUserGroups(nickname, params);
|
|
15
|
+
}
|
|
16
|
+
async getUserAttendedEvents(userIdOrNickname, params) {
|
|
17
|
+
const nickname = await this.resolveUserNickname(userIdOrNickname);
|
|
18
|
+
return this.userRepository.getUserAttendedEvents(nickname, params);
|
|
19
|
+
}
|
|
20
|
+
async getUserPresenterEvents(userIdOrNickname, params) {
|
|
21
|
+
const nickname = await this.resolveUserNickname(userIdOrNickname);
|
|
22
|
+
return this.userRepository.getUserPresenterEvents(nickname, params);
|
|
23
|
+
}
|
|
24
|
+
async getAllUsers(params = {}) {
|
|
25
|
+
const allUsers = {
|
|
26
|
+
usersReturned: 0,
|
|
27
|
+
usersAvailable: 0,
|
|
28
|
+
usersStart: 1,
|
|
29
|
+
users: [],
|
|
30
|
+
};
|
|
31
|
+
let start = 1;
|
|
32
|
+
const count = 100;
|
|
33
|
+
while (true) {
|
|
34
|
+
const response = await this.searchUsers({ ...params, start, count });
|
|
35
|
+
if (allUsers.usersAvailable === 0) {
|
|
36
|
+
allUsers.usersAvailable = response.usersAvailable;
|
|
37
|
+
allUsers.usersStart = response.usersStart;
|
|
38
|
+
}
|
|
39
|
+
allUsers.users.push(...response.users);
|
|
40
|
+
allUsers.usersReturned += response.usersReturned;
|
|
41
|
+
if (response.usersReturned < count || allUsers.users.length >= response.usersAvailable) {
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
start += count;
|
|
45
|
+
// Wait 1 second to respect API rate limit (1 request per second)
|
|
46
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
47
|
+
}
|
|
48
|
+
return allUsers;
|
|
49
|
+
}
|
|
50
|
+
async resolveUserNickname(userIdOrNickname) {
|
|
51
|
+
if (typeof userIdOrNickname === 'string') {
|
|
52
|
+
const nickname = userIdOrNickname.trim();
|
|
53
|
+
if (!nickname) {
|
|
54
|
+
throw new Error('Nickname must be a non-empty string');
|
|
55
|
+
}
|
|
56
|
+
return nickname;
|
|
57
|
+
}
|
|
58
|
+
if (!Number.isFinite(userIdOrNickname) || userIdOrNickname <= 0) {
|
|
59
|
+
throw new Error('User ID must be a positive number');
|
|
60
|
+
}
|
|
61
|
+
const userId = Math.trunc(userIdOrNickname);
|
|
62
|
+
const cachedNickname = this.nicknameCache.get(userId);
|
|
63
|
+
if (cachedNickname) {
|
|
64
|
+
return cachedNickname;
|
|
65
|
+
}
|
|
66
|
+
const response = await this.userRepository.searchUsers({ userId: [userId], count: 1 });
|
|
67
|
+
const user = response.users.find((candidate) => candidate.id === userId);
|
|
68
|
+
if (!user) {
|
|
69
|
+
throw new Error(`User with ID ${userId} was not found`);
|
|
70
|
+
}
|
|
71
|
+
this.nicknameCache.set(userId, user.nickname);
|
|
72
|
+
return user.nickname;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.UserService = UserService;
|
|
76
|
+
//# sourceMappingURL=UserService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserService.js","sourceRoot":"","sources":["../../../src/application/services/UserService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/application/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./EventService"), exports);
|
|
18
|
+
__exportStar(require("./GroupService"), exports);
|
|
19
|
+
__exportStar(require("./UserService"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/application/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B"}
|