12 KiB
User Zero Stars Querying Implementation
Documentation Date: October 24, 2025 - 12:45:02 UTC
Author: Matthew Raymer
Version: 1.0.0
Status: ✅ Complete Implementation
Overview
This document describes the implementation of User Zero stars querying functionality for the TimeSafari Daily Notification Plugin. The implementation enables querying starred projects from the TimeSafari API with a 5-minute fetch lead time before scheduled notifications.
Implementation Summary
Key Features Implemented
- User Zero Identity Configuration: Complete test user setup based on TimeSafari crowd-master
- Stars Querying API: Integration with TimeSafari's starred projects endpoint
- 5-Minute Fetch Timing: Content fetched 5 minutes before notification delivery
- Mock Testing System: Offline testing capability with realistic mock data
- Comprehensive UI: Full testing interface for User Zero functionality
Files Created/Modified
| File | Type | Purpose |
|---|---|---|
test-apps/daily-notification-test/src/config/test-user-zero.ts |
New | User Zero configuration and API client |
test-apps/daily-notification-test/capacitor.config.ts |
Modified | Plugin configuration with TimeSafari integration |
test-apps/daily-notification-test/src/views/UserZeroView.vue |
New | Testing UI for User Zero functionality |
test-apps/daily-notification-test/src/router/index.ts |
Modified | Added User Zero route |
test-apps/daily-notification-test/src/components/layout/AppHeader.vue |
Modified | Added User Zero navigation tab |
User Zero Configuration
Identity Details
Based on analysis of TimeSafari crowd-master project:
const TEST_USER_ZERO_CONFIG = {
identity: {
did: "did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F",
name: "User Zero",
seedPhrase: "rigid shrug mobile smart veteran half all pond toilet brave review universe ship congress found yard skate elite apology jar uniform subway slender luggage"
}
}
API Configuration
api: {
server: "https://api-staging.timesafari.com",
starsEndpoint: "/api/v2/report/plansLastUpdatedBetween",
jwtExpirationMinutes: 1,
jwtAlgorithm: "HS256"
}
Stars Querying Configuration
starredProjects: {
planIds: [
"test_project_1",
"test_project_2",
"test_project_3",
"demo_project_alpha",
"demo_project_beta"
],
lastAckedJwtId: "1704067200_abc123_def45678"
}
5-Minute Fetch Timing
notifications: {
fetchLeadTimeMinutes: 5, // Key requirement: 5 minutes before notification
scheduleTime: "09:00",
defaultTitle: "Daily Stars Update",
defaultBody: "New changes detected in your starred projects!"
}
Technical Implementation
Authentication System
The implementation uses JWT-based authentication matching the TimeSafari crowd-master pattern:
export function generateTestJWT(): string {
const nowEpoch = Math.floor(Date.now() / 1000);
const endEpoch = nowEpoch + TEST_USER_ZERO_CONFIG.api.jwtExpirationMinutes * 60;
const payload = {
exp: endEpoch,
iat: nowEpoch,
iss: TEST_USER_ZERO_CONFIG.identity.did,
sub: TEST_USER_ZERO_CONFIG.identity.did
};
// JWT generation logic...
}
Stars Querying API Client
export class TestUserZeroAPI {
async getStarredProjectsWithChanges(
starredPlanIds: string[],
afterId?: string
): Promise<StarredProjectsResponse> {
const url = `${this.baseUrl}${TEST_USER_ZERO_CONFIG.api.starsEndpoint}`;
const headers = {
'Authorization': `Bearer ${this.jwt}`,
'Content-Type': 'application/json'
};
const requestBody = {
planIds: starredPlanIds,
afterId: afterId || TEST_USER_ZERO_CONFIG.starredProjects.lastAckedJwtId
};
const response = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(requestBody)
});
return await response.json();
}
}
Capacitor Plugin Configuration
The plugin is configured to enable stars querying with 5-minute fetch timing:
DailyNotification: {
timesafariConfig: {
activeDid: TEST_USER_ZERO_CONFIG.identity.did,
endpoints: {
projectsLastUpdated: `${TEST_USER_ZERO_CONFIG.api.server}${TEST_USER_ZERO_CONFIG.api.starsEndpoint}`
},
starredProjectsConfig: {
enabled: true,
starredPlanHandleIds: TEST_USER_ZERO_CONFIG.starredProjects.planIds,
fetchInterval: '0 8 * * *' // Daily at 8 AM
}
},
contentFetch: {
enabled: true,
fetchLeadTimeMinutes: TEST_USER_ZERO_CONFIG.notifications.fetchLeadTimeMinutes, // 5 minutes
callbacks: {
onSuccess: 'handleStarsQuerySuccess',
onError: 'handleStarsQueryError'
}
}
}
Testing Interface
User Zero Testing UI
The UserZeroView.vue component provides a comprehensive testing interface:
Features
- Identity Display: Shows User Zero's DID, name, and API server
- Starred Projects List: Visual display of test project IDs
- Testing Controls:
- Test Stars Query button
- Test JWT Generation button
- Test Notification Scheduling button
- Toggle Mock Mode button
- Results Display: JSON output of test results
- Error Handling: Clear error messages and recovery
Navigation Integration
- Added "User Zero" tab with ⭐ icon to main navigation
- Route:
/user-zero - Responsive design for mobile and desktop
Mock Testing System
Mock Data Structure
export const MOCK_STARRED_PROJECTS_RESPONSE = {
data: [
{
planSummary: {
jwtId: "1704067200_abc123_def45678",
handleId: "test_project_1",
name: "Test Project 1",
description: "First test project for User Zero",
issuerDid: "did:key:test_issuer_1",
agentDid: "did:key:test_agent_1",
startTime: "2025-01-01T00:00:00Z",
endTime: "2025-01-31T23:59:59Z",
locLat: 40.7128,
locLon: -74.0060,
url: "https://test-project-1.com"
},
previousClaim: {
jwtId: "1703980800_xyz789_0badf00d",
claimType: "project_update"
}
}
// Additional mock projects...
],
hitLimit: false,
pagination: {
hasMore: false,
nextAfterId: null
}
}
Mock Mode Toggle
The system supports switching between real API calls and mock responses:
if (TEST_USER_ZERO_CONFIG.testing.enableMockResponses) {
console.log("🧪 Using mock starred projects response");
return MOCK_STARRED_PROJECTS_RESPONSE;
}
Usage Instructions
Accessing User Zero Testing
- Navigate to User Zero Tab: Click the ⭐ "User Zero" tab in the navigation
- View Configuration: See User Zero's DID, API server, and starred projects
- Test Stars Query: Click "Test Stars Query" to fetch starred project changes
- Test Scheduling: Click "Test Notification Scheduling" to schedule with 5-minute lead time
- Toggle Mock Mode: Enable/disable mock responses for offline testing
Testing Workflow
- Enable Mock Mode: For offline testing without API calls
- Test Stars Query: Verify the stars querying functionality
- Test JWT Generation: Validate authentication token creation
- Test Notification Scheduling: Schedule notifications with 5-minute fetch timing
- Review Results: Check JSON output for successful operations
API Integration Details
TimeSafari API Endpoints
Based on crowd-master analysis, the following endpoints are used:
- Stars Query:
POST /api/v2/report/plansLastUpdatedBetween - Authentication: JWT Bearer tokens
- Pagination: JWT ID-based cursor pagination
Request Format
{
"planIds": ["test_project_1", "test_project_2"],
"afterId": "1704067200_abc123_def45678"
}
Response Format
{
"data": [
{
"planSummary": {
"jwtId": "1704067200_abc123_def45678",
"handleId": "test_project_1",
"name": "Test Project 1",
"description": "Project description",
"issuerDid": "did:key:test_issuer_1",
"agentDid": "did:key:test_agent_1",
"startTime": "2025-01-01T00:00:00Z",
"endTime": "2025-01-31T23:59:59Z"
},
"previousClaim": {
"jwtId": "1703980800_xyz789_0badf00d",
"claimType": "project_update"
}
}
],
"hitLimit": false
}
5-Minute Fetch Timing Implementation
Configuration
The 5-minute fetch timing is configured in multiple places:
- Plugin Config:
fetchLeadTimeMinutes: 5 - User Zero Config:
fetchLeadTimeMinutes: 5 - Capacitor Config:
contentFetch.fetchLeadTimeMinutes: 5
Timing Logic
// Example: Notification scheduled for 9:00 AM
// Stars querying occurs at 8:55 AM (5 minutes before)
const notificationTime = new Date('2025-01-01T09:00:00Z');
const fetchTime = new Date(notificationTime.getTime() - (5 * 60 * 1000)); // 8:55 AM
Workflow
- Notification Scheduled: User schedules notification for specific time
- Fetch Triggered: 5 minutes before notification time
- Stars Query: API call to fetch starred project changes
- Content Preparation: Process stars data for notification
- Notification Delivery: Show notification with stars information
Error Handling
API Error Handling
try {
const result = await apiClient.getStarredProjectsWithChanges(
config.starredProjects.planIds,
config.starredProjects.lastAckedJwtId
);
// Success handling...
} catch (error) {
console.error('❌ Stars query test failed:', error);
errorMessage.value = `Stars query test failed: ${error.message}`;
// Error handling...
}
Network Error Handling
- Timeout: 30-second timeout for API calls
- Retries: 3 retry attempts with exponential backoff
- Fallback: Mock responses when network fails
Security Considerations
JWT Security
- Short Expiration: 1-minute token lifetime
- DID-based Issuer: Tokens issued by User Zero's DID
- Secure Headers: Bearer token authentication
API Security
- HTTPS Only: All API calls use HTTPS
- Content-Type: Proper JSON content type headers
- User-Agent: Identifiable user agent string
Development Notes
Code Quality
- TypeScript: Full type safety with proper interfaces
- ESLint: No linting errors in implementation
- Vue 3: Modern Vue composition API usage
- Responsive Design: Mobile-friendly UI components
Testing Strategy
- Unit Tests: Individual component testing
- Integration Tests: End-to-end workflow testing
- Mock Testing: Offline development capability
- Real API Testing: Production API validation
Future Enhancements
Planned Features
- Real-time Updates: WebSocket integration for live stars updates
- Batch Processing: Multiple starred projects in single query
- Caching: Local storage of stars data for offline access
- Analytics: Usage tracking and performance metrics
Performance Optimizations
- Request Batching: Combine multiple API calls
- Response Caching: Cache API responses locally
- Background Sync: Background stars synchronization
- Compression: Gzip compression for API responses
Troubleshooting
Common Issues
- JWT Expiration: Tokens expire after 1 minute
- Network Timeouts: 30-second timeout may be insufficient
- Mock Mode: Ensure mock mode is enabled for offline testing
- API Server: Verify staging server availability
Debug Steps
- Check Console: Review browser console for errors
- Network Tab: Inspect API calls in browser dev tools
- Mock Toggle: Switch between mock and real API calls
- JWT Refresh: Generate new JWT tokens if expired
Conclusion
The User Zero stars querying implementation provides a complete foundation for testing TimeSafari integration with the Daily Notification Plugin. The 5-minute fetch timing requirement has been successfully implemented, and the system includes comprehensive testing capabilities with both mock and real API support.
The implementation follows TimeSafari crowd-master patterns and provides a robust testing environment for stars querying functionality.
Documentation Complete: October 24, 2025 - 12:45:02 UTC