@rooguys/sdk 0.1.0 → 1.0.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/dist/types.d.ts CHANGED
@@ -1,27 +1,44 @@
1
+ /**
2
+ * Rooguys Node.js SDK Type Definitions
3
+ */
4
+ export { RooguysError, ValidationError, AuthenticationError, ForbiddenError, NotFoundError, ConflictError, RateLimitError, ServerError, FieldError, RooguysErrorOptions, ValidationErrorOptions, RateLimitErrorOptions, mapStatusToError, } from './errors';
5
+ export { RateLimitInfo, CacheMetadata, Pagination, ApiResponse, RequestConfig, HttpClientOptions, HttpClient, extractRateLimitInfo, extractRequestId, parseResponseBody, } from './http-client';
6
+ /**
7
+ * SDK initialization options
8
+ */
1
9
  export interface RooguysOptions {
10
+ /** Base URL for API (default: https://api.rooguys.com/v1) */
2
11
  baseUrl?: string;
12
+ /** Request timeout in ms (default: 10000) */
3
13
  timeout?: number;
14
+ /** Callback when rate limit is 80% consumed */
15
+ onRateLimitWarning?: ((rateLimit: import('./http-client').RateLimitInfo) => void) | null;
16
+ /** Enable auto-retry for rate-limited requests (default: false) */
17
+ autoRetry?: boolean;
18
+ /** Maximum retry attempts for rate limits (default: 3) */
19
+ maxRetries?: number;
4
20
  }
5
- export interface UserProfile {
6
- user_id: string;
7
- points: number;
8
- persona: string | null;
9
- level: {
10
- id: string;
11
- name: string;
12
- level_number: number;
13
- points_required: number;
14
- } | null;
15
- next_level: {
16
- id: string;
17
- name: string;
18
- level_number: number;
19
- points_required: number;
20
- points_needed: number;
21
- } | null;
22
- metrics: Record<string, any>;
23
- badges: UserBadge[];
21
+ /**
22
+ * Level information
23
+ */
24
+ export interface Level {
25
+ id: string;
26
+ name: string;
27
+ level_number: number;
28
+ points_required: number;
29
+ description?: string | null;
30
+ icon_url?: string | null;
31
+ created_at?: string;
24
32
  }
33
+ /**
34
+ * Next level information with points needed
35
+ */
36
+ export interface NextLevel extends Level {
37
+ points_needed: number;
38
+ }
39
+ /**
40
+ * User badge information
41
+ */
25
42
  export interface UserBadge {
26
43
  id: string;
27
44
  name: string;
@@ -29,103 +46,380 @@ export interface UserBadge {
29
46
  icon_url: string;
30
47
  earned_at: string;
31
48
  }
49
+ /**
50
+ * Activity summary for user profile
51
+ */
52
+ export interface ActivitySummary {
53
+ lastEventAt: Date | null;
54
+ eventCount: number;
55
+ daysActive: number;
56
+ }
57
+ /**
58
+ * Streak information for user profile
59
+ */
60
+ export interface StreakInfo {
61
+ currentStreak: number;
62
+ longestStreak: number;
63
+ lastActivityAt: Date | null;
64
+ streakStartedAt: Date | null;
65
+ }
66
+ /**
67
+ * Inventory summary for user profile
68
+ */
69
+ export interface InventorySummary {
70
+ itemCount: number;
71
+ activeEffects: string[];
72
+ }
73
+ /**
74
+ * User profile data
75
+ */
76
+ export interface UserProfile {
77
+ user_id: string;
78
+ display_name?: string;
79
+ email?: string;
80
+ first_name?: string;
81
+ last_name?: string;
82
+ points: number;
83
+ persona: string | null;
84
+ persona_assigned_at?: string | null;
85
+ level: Level | null;
86
+ next_level: NextLevel | null;
87
+ metrics: Record<string, number>;
88
+ badges: UserBadge[];
89
+ metadata?: Record<string, unknown>;
90
+ /** Activity summary (parsed from activity_summary) */
91
+ activitySummary?: ActivitySummary;
92
+ /** Streak information (parsed from streak) */
93
+ streak?: StreakInfo;
94
+ /** Inventory summary (parsed from inventory) */
95
+ inventory?: InventorySummary;
96
+ created_at?: string;
97
+ updated_at?: string;
98
+ }
99
+ /**
100
+ * User rank information
101
+ */
32
102
  export interface UserRank {
33
103
  user_id: string;
34
104
  rank: number;
35
105
  points: number;
36
106
  total_users: number;
107
+ percentile?: number | null;
37
108
  }
109
+ /**
110
+ * Leaderboard entry
111
+ */
38
112
  export interface LeaderboardEntry {
39
113
  rank: number;
40
114
  user_id: string;
41
115
  points: number;
42
- level: {
116
+ level_name?: string;
117
+ level_number?: number;
118
+ level?: {
43
119
  id: string;
44
120
  name: string;
45
121
  level_number: number;
46
122
  } | null;
123
+ percentile?: number | null;
124
+ }
125
+ /**
126
+ * Leaderboard statistics
127
+ */
128
+ export interface LeaderboardStats {
129
+ total_participants: number;
130
+ average_score: number;
131
+ highest_score: number;
132
+ lowest_score: number;
133
+ }
134
+ /**
135
+ * Leaderboard metadata
136
+ */
137
+ export interface LeaderboardMetadata {
138
+ id?: string;
139
+ name?: string;
140
+ description?: string;
141
+ type?: string;
142
+ timeframe?: string;
143
+ is_active?: boolean;
144
+ created_at?: string;
145
+ }
146
+ /**
147
+ * Cache metadata from leaderboard responses
148
+ */
149
+ export interface LeaderboardCacheMetadata {
150
+ cachedAt: Date | null;
151
+ ttl: number;
47
152
  }
153
+ /**
154
+ * Leaderboard result
155
+ */
48
156
  export interface LeaderboardResult {
49
- timeframe: string;
157
+ timeframe?: string;
50
158
  page: number;
51
159
  limit: number;
52
160
  total: number;
53
161
  rankings: LeaderboardEntry[];
162
+ stats?: LeaderboardStats;
163
+ metadata?: LeaderboardMetadata;
164
+ cacheMetadata?: LeaderboardCacheMetadata;
54
165
  }
166
+ /**
167
+ * Leaderboard filter options
168
+ */
169
+ export interface LeaderboardFilterOptions {
170
+ /** Page number */
171
+ page?: number;
172
+ /** Items per page */
173
+ limit?: number;
174
+ /** Search query */
175
+ search?: string;
176
+ /** Timeframe (all-time, weekly, monthly) */
177
+ timeframe?: 'all-time' | 'weekly' | 'monthly';
178
+ /** Filter by persona */
179
+ persona?: string;
180
+ /** Minimum level filter */
181
+ minLevel?: number;
182
+ /** Maximum level filter */
183
+ maxLevel?: number;
184
+ /** Start date filter (ISO 8601) */
185
+ startDate?: Date | string;
186
+ /** End date filter (ISO 8601) */
187
+ endDate?: Date | string;
188
+ }
189
+ /**
190
+ * Around user response
191
+ */
192
+ export interface AroundUserResponse extends LeaderboardResult {
193
+ user_rank?: UserRank;
194
+ }
195
+ /**
196
+ * Track event response
197
+ */
55
198
  export interface TrackEventResponse {
56
199
  status: string;
57
200
  message: string;
58
201
  profile?: UserProfile;
59
202
  }
203
+ /**
204
+ * Track options
205
+ */
206
+ export interface TrackOptions {
207
+ /** Include user profile in response */
208
+ includeProfile?: boolean;
209
+ /** Custom timestamp for historical events (max 7 days old) */
210
+ timestamp?: Date | string;
211
+ /** Idempotency key to prevent duplicate processing */
212
+ idempotencyKey?: string;
213
+ }
214
+ /**
215
+ * Batch event item
216
+ */
217
+ export interface BatchEvent {
218
+ /** Event name */
219
+ eventName: string;
220
+ /** User ID */
221
+ userId: string;
222
+ /** Event properties */
223
+ properties?: Record<string, unknown>;
224
+ /** Custom timestamp for historical events */
225
+ timestamp?: Date | string;
226
+ }
227
+ /**
228
+ * Batch event result
229
+ */
230
+ export interface BatchEventResult {
231
+ index: number;
232
+ status: 'queued' | 'error';
233
+ error?: string;
234
+ }
235
+ /**
236
+ * Batch track response
237
+ */
238
+ export interface BatchTrackResponse {
239
+ results: BatchEventResult[];
240
+ requestId?: string;
241
+ }
242
+ /**
243
+ * Batch options
244
+ */
245
+ export interface BatchOptions {
246
+ /** Idempotency key for the batch */
247
+ idempotencyKey?: string;
248
+ }
249
+ /**
250
+ * Create user data
251
+ */
252
+ export interface CreateUserData {
253
+ /** Unique user ID */
254
+ userId: string;
255
+ /** Display name */
256
+ displayName?: string;
257
+ /** Email address */
258
+ email?: string;
259
+ /** First name */
260
+ firstName?: string;
261
+ /** Last name */
262
+ lastName?: string;
263
+ /** Custom metadata */
264
+ metadata?: Record<string, unknown>;
265
+ }
266
+ /**
267
+ * Update user data (partial update supported)
268
+ */
269
+ export interface UpdateUserData {
270
+ /** Display name */
271
+ displayName?: string;
272
+ /** Email address */
273
+ email?: string;
274
+ /** First name */
275
+ firstName?: string;
276
+ /** Last name */
277
+ lastName?: string;
278
+ /** Custom metadata */
279
+ metadata?: Record<string, unknown>;
280
+ }
281
+ /**
282
+ * Batch create user result
283
+ */
284
+ export interface BatchCreateUserResult {
285
+ index: number;
286
+ status: 'created' | 'error';
287
+ user_id?: string;
288
+ error?: string;
289
+ }
290
+ /**
291
+ * Batch create response
292
+ */
293
+ export interface BatchCreateResponse {
294
+ results: BatchCreateUserResult[];
295
+ }
296
+ /**
297
+ * Get user options
298
+ */
299
+ export interface GetUserOptions {
300
+ /** Fields to include in response */
301
+ fields?: string[];
302
+ }
303
+ /**
304
+ * Search options
305
+ */
306
+ export interface SearchOptions {
307
+ /** Page number */
308
+ page?: number;
309
+ /** Items per page */
310
+ limit?: number;
311
+ /** Fields to include in response */
312
+ fields?: string[];
313
+ }
314
+ /**
315
+ * Paginated response
316
+ */
317
+ export interface PaginatedResponse<T> {
318
+ page: number;
319
+ limit: number;
320
+ total: number;
321
+ totalPages?: number;
322
+ users?: T[];
323
+ items?: T[];
324
+ }
325
+ /**
326
+ * Answer submission
327
+ */
60
328
  export interface AnswerSubmission {
61
329
  question_id: string;
62
330
  answer_option_id: string;
63
331
  }
332
+ /**
333
+ * Aha declaration result
334
+ */
64
335
  export interface AhaDeclarationResult {
65
336
  success: boolean;
66
337
  message: string;
67
338
  }
339
+ /**
340
+ * Aha score history
341
+ */
342
+ export interface AhaScoreHistory {
343
+ initial: number | null;
344
+ initial_date: string | null;
345
+ previous: number | null;
346
+ }
347
+ /**
348
+ * Aha score data
349
+ */
350
+ export interface AhaScoreData {
351
+ user_id: string;
352
+ current_score: number;
353
+ declarative_score: number | null;
354
+ inferred_score: number | null;
355
+ status: 'not_started' | 'progressing' | 'activated';
356
+ history: AhaScoreHistory;
357
+ }
358
+ /**
359
+ * Aha score result
360
+ */
68
361
  export interface AhaScoreResult {
69
362
  success: boolean;
70
- data: {
71
- user_id: string;
72
- current_score: number;
73
- declarative_score: number | null;
74
- inferred_score: number | null;
75
- status: 'not_started' | 'progressing' | 'activated';
76
- history: {
77
- initial: number | null;
78
- initial_date: string | null;
79
- previous: number | null;
80
- };
81
- };
363
+ data: AhaScoreData;
82
364
  }
365
+ /**
366
+ * Badge definition
367
+ */
83
368
  export interface Badge {
84
369
  id: string;
85
370
  name: string;
86
371
  description: string;
87
372
  icon_url: string;
88
- points_required: number;
373
+ points_required?: number;
89
374
  is_active: boolean;
90
- unlock_criteria: string;
375
+ unlock_criteria?: string | Record<string, unknown>;
91
376
  created_at: string;
92
377
  }
378
+ /**
379
+ * Badge list result
380
+ */
93
381
  export interface BadgeListResult {
94
382
  badges: Badge[];
95
383
  pagination: {
96
384
  page: number;
97
385
  limit: number;
98
386
  total: number;
387
+ totalPages?: number;
99
388
  };
100
389
  }
101
- export interface Level {
102
- id: string;
103
- name: string;
104
- level_number: number;
105
- points_required: number;
106
- description: string | null;
107
- icon_url: string | null;
108
- created_at: string;
109
- }
390
+ /**
391
+ * Level list result
392
+ */
110
393
  export interface LevelListResult {
111
394
  levels: Level[];
112
395
  pagination: {
113
396
  page: number;
114
397
  limit: number;
115
398
  total: number;
399
+ totalPages?: number;
116
400
  };
117
401
  }
402
+ /**
403
+ * Question option
404
+ */
118
405
  export interface QuestionOption {
119
406
  id: string;
120
407
  text: string;
121
- persona_weight: Record<string, number>;
408
+ persona_weight?: Record<string, number>;
409
+ persona_weights?: Record<string, number>;
122
410
  }
411
+ /**
412
+ * Question
413
+ */
123
414
  export interface Question {
124
415
  id: string;
125
416
  text: string;
126
417
  order: number;
127
418
  answer_options: QuestionOption[];
128
419
  }
420
+ /**
421
+ * Questionnaire
422
+ */
129
423
  export interface Questionnaire {
130
424
  id: string;
131
425
  slug: string;
@@ -135,14 +429,42 @@ export interface Questionnaire {
135
429
  questions: Question[];
136
430
  created_at: string;
137
431
  }
432
+ /**
433
+ * Leaderboard definition
434
+ */
435
+ export interface LeaderboardDefinition {
436
+ id: string;
437
+ name: string;
438
+ description: string;
439
+ type?: string;
440
+ timeframe?: string;
441
+ is_active?: boolean;
442
+ created_at: string;
443
+ }
444
+ /**
445
+ * Leaderboard list result
446
+ */
138
447
  export interface LeaderboardListResult {
139
448
  page: number;
140
449
  limit: number;
141
450
  total: number;
142
- leaderboards: Array<{
143
- id: string;
144
- name: string;
145
- description: string;
146
- created_at: string;
451
+ leaderboards: LeaderboardDefinition[];
452
+ }
453
+ /**
454
+ * Health check response
455
+ */
456
+ export interface HealthCheckResponse {
457
+ status: string;
458
+ version?: string;
459
+ timestamp?: string;
460
+ services?: Record<string, {
461
+ status: string;
462
+ latency?: number;
147
463
  }>;
464
+ queue_depth?: number;
465
+ processing_lag?: number;
148
466
  }
467
+ /**
468
+ * Timeframe type
469
+ */
470
+ export type Timeframe = 'all-time' | 'weekly' | 'monthly';
package/dist/types.js CHANGED
@@ -1,2 +1,23 @@
1
1
  "use strict";
2
+ /**
3
+ * Rooguys Node.js SDK Type Definitions
4
+ */
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.parseResponseBody = exports.extractRequestId = exports.extractRateLimitInfo = exports.HttpClient = exports.mapStatusToError = exports.ServerError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.ForbiddenError = exports.AuthenticationError = exports.ValidationError = exports.RooguysError = void 0;
7
+ // Re-export error types
8
+ var errors_1 = require("./errors");
9
+ Object.defineProperty(exports, "RooguysError", { enumerable: true, get: function () { return errors_1.RooguysError; } });
10
+ Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
11
+ Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return errors_1.AuthenticationError; } });
12
+ Object.defineProperty(exports, "ForbiddenError", { enumerable: true, get: function () { return errors_1.ForbiddenError; } });
13
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_1.NotFoundError; } });
14
+ Object.defineProperty(exports, "ConflictError", { enumerable: true, get: function () { return errors_1.ConflictError; } });
15
+ Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
16
+ Object.defineProperty(exports, "ServerError", { enumerable: true, get: function () { return errors_1.ServerError; } });
17
+ Object.defineProperty(exports, "mapStatusToError", { enumerable: true, get: function () { return errors_1.mapStatusToError; } });
18
+ // Re-export HTTP client types
19
+ var http_client_1 = require("./http-client");
20
+ Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_1.HttpClient; } });
21
+ Object.defineProperty(exports, "extractRateLimitInfo", { enumerable: true, get: function () { return http_client_1.extractRateLimitInfo; } });
22
+ Object.defineProperty(exports, "extractRequestId", { enumerable: true, get: function () { return http_client_1.extractRequestId; } });
23
+ Object.defineProperty(exports, "parseResponseBody", { enumerable: true, get: function () { return http_client_1.parseResponseBody; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rooguys/sdk",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Official Node.js SDK for Rooguys API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",