@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.
Files changed (99) hide show
  1. package/LICENCE +21 -0
  2. package/README.md +184 -0
  3. package/dist/application/ConnpassClient.d.ts +41 -0
  4. package/dist/application/ConnpassClient.d.ts.map +1 -0
  5. package/dist/application/ConnpassClient.js +108 -0
  6. package/dist/application/ConnpassClient.js.map +1 -0
  7. package/dist/application/services/EventService.d.ts +10 -0
  8. package/dist/application/services/EventService.d.ts.map +1 -0
  9. package/dist/application/services/EventService.js +45 -0
  10. package/dist/application/services/EventService.js.map +1 -0
  11. package/dist/application/services/GroupService.d.ts +9 -0
  12. package/dist/application/services/GroupService.d.ts.map +1 -0
  13. package/dist/application/services/GroupService.js +39 -0
  14. package/dist/application/services/GroupService.js.map +1 -0
  15. package/dist/application/services/UserService.d.ts +25 -0
  16. package/dist/application/services/UserService.d.ts.map +1 -0
  17. package/dist/application/services/UserService.js +76 -0
  18. package/dist/application/services/UserService.js.map +1 -0
  19. package/dist/application/services/index.d.ts +4 -0
  20. package/dist/application/services/index.d.ts.map +1 -0
  21. package/dist/application/services/index.js +20 -0
  22. package/dist/application/services/index.js.map +1 -0
  23. package/dist/domain/entities/Event.d.ts +46 -0
  24. package/dist/domain/entities/Event.d.ts.map +1 -0
  25. package/dist/domain/entities/Event.js +3 -0
  26. package/dist/domain/entities/Event.js.map +1 -0
  27. package/dist/domain/entities/Group.d.ts +28 -0
  28. package/dist/domain/entities/Group.d.ts.map +1 -0
  29. package/dist/domain/entities/Group.js +3 -0
  30. package/dist/domain/entities/Group.js.map +1 -0
  31. package/dist/domain/entities/Presentation.d.ts +17 -0
  32. package/dist/domain/entities/Presentation.d.ts.map +1 -0
  33. package/dist/domain/entities/Presentation.js +3 -0
  34. package/dist/domain/entities/Presentation.js.map +1 -0
  35. package/dist/domain/entities/User.d.ts +23 -0
  36. package/dist/domain/entities/User.d.ts.map +1 -0
  37. package/dist/domain/entities/User.js +3 -0
  38. package/dist/domain/entities/User.js.map +1 -0
  39. package/dist/domain/entities/index.d.ts +5 -0
  40. package/dist/domain/entities/index.d.ts.map +1 -0
  41. package/dist/domain/entities/index.js +21 -0
  42. package/dist/domain/entities/index.js.map +1 -0
  43. package/dist/domain/errors/ConnpassError.d.ts +18 -0
  44. package/dist/domain/errors/ConnpassError.d.ts.map +1 -0
  45. package/dist/domain/errors/ConnpassError.js +46 -0
  46. package/dist/domain/errors/ConnpassError.js.map +1 -0
  47. package/dist/domain/errors/index.d.ts +2 -0
  48. package/dist/domain/errors/index.d.ts.map +1 -0
  49. package/dist/domain/errors/index.js +18 -0
  50. package/dist/domain/errors/index.js.map +1 -0
  51. package/dist/domain/repositories/IEventRepository.d.ts +6 -0
  52. package/dist/domain/repositories/IEventRepository.d.ts.map +1 -0
  53. package/dist/domain/repositories/IEventRepository.js +3 -0
  54. package/dist/domain/repositories/IEventRepository.js.map +1 -0
  55. package/dist/domain/repositories/IGroupRepository.d.ts +5 -0
  56. package/dist/domain/repositories/IGroupRepository.d.ts.map +1 -0
  57. package/dist/domain/repositories/IGroupRepository.js +3 -0
  58. package/dist/domain/repositories/IGroupRepository.js.map +1 -0
  59. package/dist/domain/repositories/IUserRepository.d.ts +19 -0
  60. package/dist/domain/repositories/IUserRepository.d.ts.map +1 -0
  61. package/dist/domain/repositories/IUserRepository.js +3 -0
  62. package/dist/domain/repositories/IUserRepository.js.map +1 -0
  63. package/dist/domain/repositories/index.d.ts +4 -0
  64. package/dist/domain/repositories/index.d.ts.map +1 -0
  65. package/dist/domain/repositories/index.js +20 -0
  66. package/dist/domain/repositories/index.js.map +1 -0
  67. package/dist/domain/utils/validators.d.ts +9 -0
  68. package/dist/domain/utils/validators.d.ts.map +1 -0
  69. package/dist/domain/utils/validators.js +76 -0
  70. package/dist/domain/utils/validators.js.map +1 -0
  71. package/dist/index.d.ts +6 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +24 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/infrastructure/cache/PresentationCache.d.ts +20 -0
  76. package/dist/infrastructure/cache/PresentationCache.d.ts.map +1 -0
  77. package/dist/infrastructure/cache/PresentationCache.js +91 -0
  78. package/dist/infrastructure/cache/PresentationCache.js.map +1 -0
  79. package/dist/infrastructure/http/HttpClient.d.ts +17 -0
  80. package/dist/infrastructure/http/HttpClient.d.ts.map +1 -0
  81. package/dist/infrastructure/http/HttpClient.js +75 -0
  82. package/dist/infrastructure/http/HttpClient.js.map +1 -0
  83. package/dist/infrastructure/repositories/EventRepository.d.ts +14 -0
  84. package/dist/infrastructure/repositories/EventRepository.d.ts.map +1 -0
  85. package/dist/infrastructure/repositories/EventRepository.js +117 -0
  86. package/dist/infrastructure/repositories/EventRepository.js.map +1 -0
  87. package/dist/infrastructure/repositories/GroupRepository.d.ts +10 -0
  88. package/dist/infrastructure/repositories/GroupRepository.d.ts.map +1 -0
  89. package/dist/infrastructure/repositories/GroupRepository.js +35 -0
  90. package/dist/infrastructure/repositories/GroupRepository.js.map +1 -0
  91. package/dist/infrastructure/repositories/UserRepository.d.ts +24 -0
  92. package/dist/infrastructure/repositories/UserRepository.d.ts.map +1 -0
  93. package/dist/infrastructure/repositories/UserRepository.js +68 -0
  94. package/dist/infrastructure/repositories/UserRepository.js.map +1 -0
  95. package/dist/infrastructure/repositories/index.d.ts +4 -0
  96. package/dist/infrastructure/repositories/index.d.ts.map +1 -0
  97. package/dist/infrastructure/repositories/index.js +20 -0
  98. package/dist/infrastructure/repositories/index.js.map +1 -0
  99. 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":";;;;;;AAAA,gDAAwB;AACxB,kEAA+D;AAC/D,iEAAkG;AAClG,yCAAqE;AAUrE,iFAA8E;AAY9E,MAAa,cAAc;IAKzB,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,uBAAU,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,6BAA6B;YACxD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,IAAI,qCAAiB,CAAC;YAC9C,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,uBAAuB,CAAC;YACjE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,sBAAsB,CAAC;YAC1D,QAAQ,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,qBAAqB,CAAC;SAC9D,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,8BAAe,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAC3E,MAAM,eAAe,GAAG,IAAI,8BAAe,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,cAAc,GAAG,IAAI,6BAAc,CAAC,UAAU,CAAC,CAAC;QAEtD,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAY,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAY,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,IAAI,sBAAW,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAA4B,EAAE;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAqD,EAAE;QACxE,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAe;QACzC,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAA4B,EAAE;QAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,SAAqD,EAAE;QACxE,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAA2B,EAAE;QAC7C,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAoD,EAAE;QACtE,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,gBAAiC,EACjC,MAA2C;QAE3C,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,qBAAqB,CACzB,gBAAiC,EACjC,MAA8D;QAE9D,OAAO,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,gBAAiC,EACjC,MAA8D;QAE9D,OAAO,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC3E,CAAC;IAEO,mBAAmB,CAAC,QAAkB;QAC5C,IAAI,OAAO,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC;QAC5D,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,eAAe,CAAC,QAAiB;QACvC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC;QAC/D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,kBAAkB;QAClB,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxB,CAAC;IAEO,gBAAgB,CAAC,QAAiB;QACxC,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAC7D,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,OAAO,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,yBAAyB,CAAC,CAAC;IACrE,CAAC;CACF;AAnID,wCAmIC"}
@@ -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,4 @@
1
+ export * from './EventService';
2
+ export * from './GroupService';
3
+ export * from './UserService';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}