Tags: FluidifyAI/Regen
Tags
docs(changelog): add v1.1.0 entry (#156) * feat(push): add Firebase Admin SDK dependency [OPE-234] * feat(push): add migration 000043 - device_tokens table [OPE-234] * feat(push): add DeviceToken GORM model [OPE-234] * feat(push): implement DeviceTokenRepository with 20-token cap [OPE-234] * feat(push): add GoogleApplicationCredentials to config [OPE-234] * feat(push): implement PushService with FCM sender abstraction [OPE-234] * feat(push): implement device token registration and unregistration endpoints [OPE-234] * feat(push): write incident service push trigger tests (RED) [OPE-234] * feat(push): trigger push notifications on incident create and resolve Wire PushNotifier into incidentService so the on-call commander receives a push when an incident is created via CreateIncidentFromAlert and CreateIncidentFromAlertWithGrouping. The commander also receives a resolved push from both ResolveIncident and UpdateIncident. Goroutines are guarded by recoverAsyncPanic; the token string is never logged. Use non-deprecated option.WithAuthCredentialsJSON and messaging.IsUnregistered APIs. [OPE-234] * feat(push): add push notification trigger to escalation worker When SetPushService is called, SendEscalationDM resolves the on-call user's UUID via userRepo.GetByEmail and sends a push notification alongside the existing Slack DM. User not found is a soft error — the DM is still sent and no error is returned to the caller. [OPE-234] * feat(push): add PushCleanupWorker to sweep stale device tokens Runs a DeleteStale pass on startup then every 24 hours; removes tokens not seen in 90 days. The 90-day constant is defined once in the implementation file with no magic numbers at call sites. [OPE-234] * feat(push): wire push infrastructure into server startup and routes Construct deviceTokenRepo and PushService in serve.go; pass both to SetupRoutes and StartAll. Routes registers /push/register and /push/unregister under the authenticated group when deviceTokenRepo is set. StartAll wires push into the escalation worker and launches PushCleanupWorker when Firebase is configured. Server starts cleanly without GOOGLE_APPLICATION_CREDENTIALS — push is simply disabled. [OPE-234] * fix(push): address code review findings in push notification infrastructure - Add index on device_tokens(token) to avoid full table scans in DeleteByToken and UpdateLastSeen - Serialize concurrent Upsert calls with SELECT FOR UPDATE on the user row to close TOCTOU race in the 20-token-per-user cap check (PostgreSQL only; SQLite in tests skips the lock via dialect check) - Remove duplicate startup log in start.go; PushCleanupWorker.Run already emits the same message with richer context fields - Fix isErrTokenLimitExceeded test helper to use errors.Is instead of err.Error() string comparison so it stays correct if the error is ever wrapped * docs(changelog): add v1.1.0 entry for push notification infrastructure
[OPE-184] Analytics: enterprise hook + user_id tracking for AI usage (#… …123) * docs(spec): add design spec for OPE-184 analytics dashboard * feat(enterprise): add AnalyticsProvider hook + UserID on UsageEvent Adds AnalyticsProvider interface with noopAnalytics stub (returns 402) wired into enterprise.Hooks and registered at /api/v1/analytics in routes.go. Extends UsageEvent with UserID *uuid.UUID and CostSummary with ByUser []UserCostRow so the Pro costtracker can attribute AI spend to individual users. Five AI handler call sites now extract the authenticated user via middleware.GetLocalUser and populate UserID. Closes OPE-184 * feat(analytics): replace coming-soon with Upgrade to Pro upsell page * fix(analytics): point upsell CTA to GitHub repo instead of broken domain
[OPE-191] Show running app version in the UI (#122) * fix(schedules): send RFC 3339 datetime for unavailability start/end dates Backend CreateUnavailabilityRequest uses time.Time which requires RFC 3339 format; bare YYYY-MM-DD fails Go JSON unmarshal. Append T00:00:00Z on the way out — backend truncates to date-only anyway. * test(health): add failing tests for version field in health response [OPE-191] * feat(health): add appVersion parameter to Health handler, return version in response [OPE-191] * feat(serve): wire version ldflag variable through SetupRoutes to health endpoint [OPE-191] * build(makefile): inject VERSION via ldflag in build target [OPE-191] * build(docker): pass APP_VERSION build-arg as ldflag into Go binary [OPE-191] * ci(release): pass APP_VERSION build-arg from git tag to Docker build [OPE-191] * feat(frontend): add health API module with getHealth function [OPE-191] * feat(sidebar): fetch and display app version below admin nav when expanded [OPE-191] * fix(build): pass APP_VERSION to docker build; proxy /health in Vite dev server
PreviousNext