@offcoin/sdk
Advanced tools
@@ -12,7 +12,9 @@ /** | ||
| * Get the leaderboard | ||
| * @param options - Optional sorting and limit options | ||
| * @param options - Optional sorting, period, limit, and metadata filter options | ||
| * @param options.sort - Sort by 'tokens', 'xp', or 'level' (default: 'xp') | ||
| * @param options.period - Period to show: 'current-week', 'current-month', 'current-year', or 'all-time' (default: 'all-time') | ||
| * @param options.limit - Max number of entries to return (1-100, default: 50) | ||
| * @param options.metadata - Filter members by metadata key-value pairs | ||
| */ | ||
| get(options?: LeaderboardOptions): Promise<LeaderboardResponse>; | ||
| } |
@@ -12,5 +12,7 @@ /** | ||
| * Get the leaderboard | ||
| * @param options - Optional sorting and limit options | ||
| * @param options - Optional sorting, period, limit, and metadata filter options | ||
| * @param options.sort - Sort by 'tokens', 'xp', or 'level' (default: 'xp') | ||
| * @param options.period - Period to show: 'current-week', 'current-month', 'current-year', or 'all-time' (default: 'all-time') | ||
| * @param options.limit - Max number of entries to return (1-100, default: 50) | ||
| * @param options.metadata - Filter members by metadata key-value pairs | ||
| */ | ||
@@ -21,4 +23,11 @@ get(options) { | ||
| params.set('sort', options.sort); | ||
| if (options?.period) | ||
| params.set('period', options.period); | ||
| if (options?.limit !== undefined) | ||
| params.set('limit', String(options.limit)); | ||
| if (options?.metadata && Object.keys(options.metadata).length > 0) { | ||
| // Build query string with metadata filter | ||
| const metadataParam = encodeURIComponent(JSON.stringify(options.metadata)); | ||
| params.set('metadata', metadataParam); | ||
| } | ||
| const query = params.toString(); | ||
@@ -25,0 +34,0 @@ return this.client.get(`/api/v1/leaderboard${query ? `?${query}` : ''}`); |
@@ -6,3 +6,3 @@ /** | ||
| import type { HttpClient } from '../client.js'; | ||
| import type { Member, MemberBalance, MemberXp, TokenOperationResult, XpOperationResult, CreateMemberInput, UpdateMemberInput, MemberAliasesResponse, AddAliasResult, RemoveAliasResult } from '../types.js'; | ||
| import type { Member, MemberBalance, MemberXp, TokenOperationResult, XpOperationResult, CreateMemberInput, UpdateMemberInput, MemberAliasesResponse, AddAliasResult, RemoveAliasResult, ListMembersOptions } from '../types.js'; | ||
| export declare class MembersResource { | ||
@@ -13,4 +13,5 @@ private readonly client; | ||
| * List all members for the tenant | ||
| * @param options - Optional filters including metadata | ||
| */ | ||
| list(): Promise<Member[]>; | ||
| list(options?: ListMembersOptions): Promise<Member[]>; | ||
| /** | ||
@@ -28,3 +29,3 @@ * Create a new member | ||
| * @param alias - Member alias or ID | ||
| * @param data - Fields to update (name, avatarUrl) | ||
| * @param data - Fields to update (name, avatarUrl, metadata) | ||
| */ | ||
@@ -31,0 +32,0 @@ update(alias: string, data: UpdateMemberInput): Promise<Member>; |
@@ -12,5 +12,12 @@ /** | ||
| * List all members for the tenant | ||
| * @param options - Optional filters including metadata | ||
| */ | ||
| list() { | ||
| return this.client.get('/api/v1/members'); | ||
| list(options) { | ||
| let path = '/api/v1/members'; | ||
| if (options?.metadata && Object.keys(options.metadata).length > 0) { | ||
| // Build query string with metadata filter | ||
| const metadataParam = encodeURIComponent(JSON.stringify(options.metadata)); | ||
| path += `?metadata=${metadataParam}`; | ||
| } | ||
| return this.client.get(path); | ||
| } | ||
@@ -33,3 +40,3 @@ /** | ||
| * @param alias - Member alias or ID | ||
| * @param data - Fields to update (name, avatarUrl) | ||
| * @param data - Fields to update (name, avatarUrl, metadata) | ||
| */ | ||
@@ -36,0 +43,0 @@ update(alias, data) { |
+9
-0
@@ -22,2 +22,3 @@ /** | ||
| level: number; | ||
| metadata?: Record<string, string>; | ||
| createdAt: string; | ||
@@ -109,2 +110,3 @@ updatedAt: string; | ||
| sort: 'tokens' | 'xp' | 'level'; | ||
| period: 'current-week' | 'current-month' | 'current-year' | 'all-time'; | ||
| limit: number; | ||
@@ -134,2 +136,3 @@ members: LeaderboardEntry[]; | ||
| aliases?: string[]; | ||
| metadata?: Record<string, string>; | ||
| } | ||
@@ -139,3 +142,7 @@ export interface UpdateMemberInput { | ||
| avatarUrl?: string | null; | ||
| metadata?: Record<string, string>; | ||
| } | ||
| export interface ListMembersOptions { | ||
| metadata?: Record<string, string>; | ||
| } | ||
| export interface MemberAlias { | ||
@@ -165,3 +172,5 @@ id: string; | ||
| sort?: 'tokens' | 'xp' | 'level'; | ||
| period?: 'current-week' | 'current-month' | 'current-year' | 'all-time'; | ||
| limit?: number; | ||
| metadata?: Record<string, string>; | ||
| } |
+1
-1
| { | ||
| "name": "@offcoin/sdk", | ||
| "version": "0.0.5", | ||
| "version": "0.0.6", | ||
| "description": "TypeScript/JavaScript SDK for the Offcoin API", | ||
@@ -5,0 +5,0 @@ "scripts": { |
+58
-6
@@ -28,6 +28,12 @@ # @offcoin/sdk | ||
| // List members with metadata filter | ||
| const filteredMembers = await offcoin.members.list({ | ||
| metadata: { department: 'engineering', role: 'senior' } | ||
| }); | ||
| // Create a member | ||
| const newMember = await offcoin.members.create({ | ||
| name: 'John Doe', | ||
| aliases: ['discord:123456', 'github:johndoe'] | ||
| aliases: ['discord:123456', 'github:johndoe'], | ||
| metadata: { department: 'engineering', role: 'developer' } // optional | ||
| }); | ||
@@ -48,2 +54,7 @@ | ||
| // List members filtered by metadata | ||
| const filteredMembers = await offcoin.members.list({ | ||
| metadata: { department: 'engineering', role: 'senior' } | ||
| }); | ||
| // Create a member | ||
@@ -53,3 +64,4 @@ const member = await offcoin.members.create({ | ||
| avatarUrl: 'https://example.com/avatar.png', // optional | ||
| aliases: ['discord:123456', 'github:johndoe'] // optional | ||
| aliases: ['discord:123456', 'github:johndoe'], // optional | ||
| metadata: { department: 'engineering', role: 'developer' } // optional | ||
| }); | ||
@@ -59,2 +71,3 @@ | ||
| const member = await offcoin.members.get('discord:123456'); | ||
| // member.metadata contains the member's metadata | ||
@@ -64,3 +77,4 @@ // Update a member | ||
| name: 'Jane Doe', | ||
| avatarUrl: null // remove avatar | ||
| avatarUrl: null, // remove avatar | ||
| metadata: { department: 'engineering', role: 'senior' } // merge with existing metadata | ||
| }); | ||
@@ -101,6 +115,6 @@ | ||
| ```typescript | ||
| // Get leaderboard (default: sorted by XP, limit 50) | ||
| // Get leaderboard (default: sorted by XP, limit 50, all-time) | ||
| const leaderboard = await offcoin.leaderboard.get(); | ||
| // Get top 10 by tokens | ||
| // Get top 10 by tokens (all-time) | ||
| const tokenLeaderboard = await offcoin.leaderboard.get({ | ||
@@ -111,3 +125,3 @@ sort: 'tokens', | ||
| // Get top 25 by level | ||
| // Get top 25 by level (all-time) | ||
| const levelLeaderboard = await offcoin.leaderboard.get({ | ||
@@ -117,4 +131,41 @@ sort: 'level', | ||
| }); | ||
| // Get current week leaderboard (gains this week) | ||
| const weeklyLeaderboard = await offcoin.leaderboard.get({ | ||
| sort: 'xp', | ||
| period: 'current-week', | ||
| limit: 20 | ||
| }); | ||
| // Get current month leaderboard (gains this month) | ||
| const monthlyLeaderboard = await offcoin.leaderboard.get({ | ||
| sort: 'tokens', | ||
| period: 'current-month', | ||
| limit: 50 | ||
| }); | ||
| // Get current year leaderboard (gains this year) | ||
| const yearlyLeaderboard = await offcoin.leaderboard.get({ | ||
| sort: 'level', | ||
| period: 'current-year', | ||
| limit: 100 | ||
| }); | ||
| // Get leaderboard filtered by metadata | ||
| const engineeringLeaderboard = await offcoin.leaderboard.get({ | ||
| sort: 'xp', | ||
| period: 'current-month', | ||
| limit: 20, | ||
| metadata: { department: 'engineering', role: 'senior' } | ||
| }); | ||
| ``` | ||
| **Period Options:** | ||
| - `'all-time'` (default): Shows current balances/XP (all-time leaderboard) | ||
| - `'current-week'`: Shows gains from the start of the current week (Monday 00:00 UTC) | ||
| - `'current-month'`: Shows gains from the start of the current month | ||
| - `'current-year'`: Shows gains from the start of the current year | ||
| **Note:** Time-based periods (`current-week`, `current-month`, `current-year`) show only members who have activity (gains) in that period. Members with zero activity are excluded. | ||
| ### Permissions | ||
@@ -350,2 +401,3 @@ | ||
| PurchasePermissionResult, | ||
| ListMembersOptions, | ||
| // Webhook types | ||
@@ -352,0 +404,0 @@ WebhookPayload, |
54833
7.01%1246
2.3%423
14.02%