Goongoonalo

Release Notes

Markdown source of truth

Rendered from CHANGELOG.md

This page stays aligned with the repository changelog so release notes can be maintained in one place and viewed in the app.

Changelog

All notable releases for goongoonalo-main-backend are documented in this file.

Tagged releases currently present in Git:

  • 0.1.0
  • 0.1.1
  • 0.1.2
  • 0.2.0
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.2.7
  • 0.2.8
  • 0.2.9
  • 0.2.10
  • 0.2.11
  • 0.2.12
  • 0.2.13
  • 0.2.14
  • 0.2.15
  • 0.2.16
  • 0.2.17
  • 0.2.18
  • 0.2.19

[0.2.19] - 2026-07-01

Compare: 0.2.18...0.2.19

Changed

  • g SDK dependency: Bumped from 0.1.116 to 0.1.117, which adds a normalize_social_links validator on ArtistUpdateRequest that accepts null and coerces an empty/falsy socialLinks list to None.

[0.2.18] - 2026-06-30

Compare: 0.2.17...0.2.18

Added

Billing — Subscription Coupon Support

  • SubscriptionService: Full coupon validation and discount resolution for both recurring subscriptions and one-time plan purchases. Coupons are resolved via get_valid_coupon_by_code(), with percentage and fixed-amount discounts applied to pricing breakdowns and stored gateway metadata.
  • SubscriptionService.validate_coupon(): Replaces the previous placeholder coupon validation endpoint logic. Validates coupon existence, expiry, zone applicability, subscription-plan binding, and returns structured discount details (discount, discountPercent, providerOfferId).
  • Razorpay offer integration: Recurring subscription purchases now pass offer_id (from provider_offer_id) to Razorpay when a valid coupon is applied; one-time orders reduce the charged amount directly.
  • RazorpayWebhookService._record_coupon_usage(): After subscription activation (one-time and recurring), appends the subscriber to billing_coupons.availed_users via CouponRepository.apply_coupon().
  • Coupon usage on payment verify: Coupon code is persisted in gateway details during purchase and recorded once payment is confirmed.

Database Migration — 0.2.18

  • Drops the legacy coupons table (01__drop_existing_coupons_table.sql) in favour of the new billing_coupons schema managed by g-backend-sdk.
  • Seeds an initial SMA10 subscription coupon via migrations/0.2.18/initial.py.

Changed

  • CouponsAPI: validate_coupon and validate_coupon_post now delegate to SubscriptionService.validate_coupon() with subscription and period parameters; removed the standalone apply_coupon endpoint.
  • CouponsAPI.search_coupons: coupon_type filter now uses the CouponType enum instead of a raw integer.
  • ArtistApplicationService: get_artist_application_status(), get_artist_application(), and submit_additional_details() now return None when no application exists for the user, instead of raising ArtistApplicationNotFoundException. Supports artists who have not yet started the application flow.
  • SDK bump: g-backend-sdk production dependency updated to 0.1.116.
  • Alembic removed from production requirements (requirements/prod.in).

Fixed

  • SubscriptionService: Session is now explicitly committed after applying a coupon during subscription purchase, ensuring coupon usage is persisted before the response is returned.

[0.2.17] - 2026-06-18

Compare: 0.2.16...0.2.17

Added

Home API — G-Originals Content-Type Filter

  • GET /home/g-originals now accepts an optional content_type query parameter (ContentType enum). When omitted the endpoint defaults to ContentType.Music, matching previous behaviour for existing clients.
  • HomeService.get_g_originals() passes content_type through to the repository and incorporates it into the Redis cache key (home_g_originals_{content_type}_{page}_{per_page}), so results for different content types are cached independently.

Search — Playlist Owner Name Fields

  • Playlist owner entries returned inside search results now include firstName and lastName fields on LeadArtistShortSchema (previously only stageName and profilePicture were populated). stageName is also stripped of surrounding whitespace before serialisation.

Changed

  • SDK bump: g-backend-sdk production dependency updated to 0.1.114.

[0.2.16] - 2026-06-18

Compare: 0.2.15...0.2.16

Changed

  • Version and SDK bump release: Application version updated to 0.2.16; g-backend-sdk production dependency bumped to 0.1.113 (requirements/prod.in). No additional backend feature or behavior changes in this release range.

[0.2.15] - 2026-06-17

Compare: 0.2.14...0.2.15

Added

  • SubscriptionsAPI — subscription plans page endpoint (GET /subscriptions/plans-page): New endpoint that returns a combined SubscriptionPlanPageDetailsSchema containing both the available subscription plans (filtered by country code via ?cc= query param, defaulting to IN) and the plans page display texts, eliminating the need for clients to make two separate calls.

[0.2.14] - 2026-06-17

Compare: 0.2.13...0.2.14

Added

  • PlaylistCRUDRouter — admin studio client detection: A new helper method checks whether a request originates from an admin studio client; when it does, a predefined system user is assigned to the playlist instead of the requesting user, preventing admin-created playlists from being incorrectly attributed to admin accounts.

Changed

  • ReferralService — simplified referral URL generation: Referrer name derivation no longer performs intermediate string manipulation; lowercase and hyphenation are applied directly during URL construction, resulting in cleaner, more consistent referral URLs.

Fixed

  • AuthService — session commit after OTP send during registration: Database session is now explicitly committed after the OTP is sent in the registration flow, ensuring the user record is persisted before the client receives the response.

[0.2.13] - 2026-06-16

Compare: 0.2.12...0.2.13

Added

  • Live streaming tables (migration 20260616_01): New GetStream-backed live streaming tables added; chat theme column added to app_settings (migration 03); is_visible_to_artist column added to playlists (migration 04).
  • G-Internal upload management: Full upload management API and services for G-Internal content (g_upload_service, internal_upload_metadata, internal_upload_studio_service); endpoints exposed via uploads_api; session-based upload flow with S3 integration; internal upload metadata schema and test coverage included.
  • Promotions API on Home service: Promotions content surfaced on the Home API; related home service and endpoint wiring updated accordingly.
  • Claim service — role validation & promotion CRUD: Role validation and promotion CRUD functionality added to ClaimService; artist application admin service updated to support promotion workflows.
  • Email notifications — user context & token generation: Email notification system enhanced with user context propagation and temporary access token generation for deep-link notification URLs.
  • User profile — acquisition data on update: User profile update flow now captures and persists acquisition data (source, campaign, etc.) in addition to the existing registration path.
  • Unique referral payment history constraint (migration 05): Unique constraint on (referred_artist_id) added to the referral payment history table to prevent duplicate payment records.
  • GetStream artist feed sync script: New sync_getstream_artist_feed_users.py script to reconcile artist feed followers with GetStream state.

Changed

  • Dependency injection refactor: Service dependency injections extracted into dedicated dependencies.py modules across the artists, billing, webhooks, and studio apps; API routers updated to consume injected services rather than constructing them inline.
  • Social publishing services consolidated: All legacy platform-specific publisher files (facebook_publisher.py, instagram_publisher.py, linkedin_publisher.py, x_publisher.py, youtube_publisher.py) removed; logic consolidated into a unified social_publish_service; token_manager_service removed; new test coverage added for the consolidated service.
  • GetStreamWebhookService — reaction handling cleanup: Reaction handling logic refactored for readability; redundant branches and dead code removed; test suite significantly expanded.
  • ReferralService — max invites limit removed: Max invites limit check removed to simplify the invite flow.
  • ClaimService simplified: Unused role validation and in-progress claim checks removed; service contract cleaned up ahead of the promotion CRUD additions.
  • Project structure & workspace cleanup: Legacy manage.py Flask CLI removed; project folder renamed to reflect the FastAPI backend; workspace configuration corrected.
  • phonenumbers dependency version updated in base requirements.
  • g-backend-sdk bumped.

Fixed

  • Session commit after album contents update: UserStudioService now correctly commits the database session after updating album contents, preventing stale-data responses.
  • G-Internal upload API paths: Upload endpoint paths corrected; unused legacy content ingest code removed to avoid routing conflicts.

Removed

  • Unused social tables (migration 06): Migration added to drop legacy social platform tables no longer referenced by the application.
  • Legacy data-migration scripts: migrate_mongo_to_postgres.py, pdl_data_process.py, and sync_mongo.py removed (migrations complete; scripts no longer needed).

[0.2.12] - 2026-06-12

Compare: 0.2.11...0.2.12

Added

  • App event trigger options endpoint: New GET /users/journey/triggers endpoint that returns all AppEventsTriggerEnum values as selectable options; get_app_event_trigger_options() added to UserStudioService to back it.
  • Typed trigger filter on user journey API: The trigger_name query parameter on GET /users/journey/{user_id} is now typed to AppEventsTriggerEnum instead of a bare string, enabling server-side validation and IDE discoverability.
  • Playlist visibility restrictions: PlaylistCRUDRouter now scopes playlist listing to the requesting user for non-admin callers; user association is automatically applied on playlist creation.
  • Playback session unique constraint per logical session (migration 20260612_01): Replaces the old (user_id, content_id, client_session_id, state)-keyed constraint with (user_id, content_id, client_session_id), allowing a finalized session to be reopened in place rather than spawning a duplicate row. Existing duplicates are de-duplicated on migration.
  • Session IDs on app_events (migration 20260612_02): client_session_id and server_session_id columns added to the app_events table; client_session_id indexed for performant session-scoped lookups.

Changed

  • AppEventsService — session tracking refactor: Internal session tracking and playback-session adjustment logic significantly overhauled to align with the new per-logical-session uniqueness model.
  • PlaylistCRUDRouter — transformation logic: Playlist data transformation refactored for correctness and clarity.
  • Note handling in ArtistsApplicationService: Note handling improved; user retrieval logic for phone-number checks consolidated, removing redundant branches.
  • Email template service: Template rendering logic enhanced alongside the artist application note improvements.

Fixed

  • Column order in initial platform settings insert: Corrected the column order in migrations/0.2.11/03__insert_initial_platform_settings.sql to match the table definition.

[0.2.11] - 2026-06-11

Compare: 0.2.10...0.2.11

Added

  • Platform-wide settings API: Full CRUD API for platform-wide settings wired into the main application; PlatformSettings entity type added to studio event config; initial database migration included.
  • Threads social publishing: OAuth callbacks and end-to-end publishing support added for the Threads platform in SocialPublishService.
  • Social publishing — artist ID resolution & Goongoonalo platform: SocialPublishService now resolves artist IDs before publishing; Goongoonalo platform added as a publishing target; artist existence check added before publish; StreamFeed integration included.
  • Platform-wide follows endpoint: New endpoint to follow all platform core artists at once; LikesService.follow_all_core_artists added; AuthService updated to invoke this automatically on new-user signup.
  • Playlist thumbnails: Thumbnail management endpoints added for playlists; a background task is now enqueued to auto-generate thumbnails for playlists whose thumbnail URL is empty; thumbnail URL extraction added for actors in GetStreamWebhookService.
  • GetStream — comment reactions & notifications: Reaction handling and notification dispatch logic added for comment events; recipient push-token resolution added; improved reaction and notification context propagation throughout GetStreamWebhookService.
  • G-Originals on Home API: HomeService and the Home API updated to surface G-Originals content alongside other home-feed content.
  • User acquisition tracking: AuthService now captures and persists user acquisition data (source, campaign, etc.) on registration; corresponding tests added.
  • Artist application — 5th Circle filter: New filter field added to artist application schemas to identify readiness for the 5th Circle project.
  • FCM logout invalidation: Logout flow now invalidates all FCM device registrations for the session, preventing stale push-token deliveries.
  • Playback session — device & appInfo tracking: AppEventsService enriched with device metadata and appInfo tracking per playback session.
  • Logo management & welcome notifications: Application logo management enhanced; welcome notifications added for new-user onboarding flows.
  • g_handle uniqueness migration: SQL migration to deduplicate existing g_handle values and add a unique index, preventing duplicates going forward.
  • Parent album mapping in content lists: after_list enrichment now attaches parent album metadata to each returned content item.

Changed

  • generate_temporary_access_token: Renamed from generate_temp_access_token throughout for clarity.
  • Referral text building: Referral text construction extracted into a dedicated ReferralService method; PlatformSettingsManager integrated to supply configurable referral copy; URL generation logic refactored for readability with an improved fallback.
  • GetStream webhook — FCM & reaction refactor: FCM token resolution streamlined; reaction-handling and notification logic overhauled for correctness; unused S3 manager and related helper methods removed.
  • SocialPublishService.disconnect: Now returns the deleted social-account snapshot instead of the updated status object (aligned with the pattern established in 0.2.9).
  • YouTube API scopes: Scopes updated in SocialPublishService for the required level of access.
  • Content & library service cleanup: ContentService and LibraryService refactored for improved clarity; audio credit handling normalized and canonicalized; credit designations and sort order standardised.
  • get_user_by_id deprecated: Endpoint annotated as deprecated ahead of removal in a future release.
  • g-backend-sdk bumped to 0.1.110.

Fixed

  • GetStream post-like handling: Webhook service now correctly identifies and routes post-like reactions.
  • Duplicate comment-like notifications: Guards added to prevent duplicate push notifications for comment likes; reaction deletion events now handled to clean up notification state.
  • Channel metadata for mobile clients: Chat channel name and image fields are now always populated, fixing display issues in mobile clients.
  • User handle suggestion: Handle suggestion now derives from the first name only (was incorrectly requiring a full name).
  • Artist service — forbidden exception: StudioRoleNotFoundException replaced with ForbiddenException in ArtistService; user-not-found handling in AuthService cleaned up.
  • Artist application CRUD — field casing: Search and sortable field names corrected to camelCase, matching the API contract.
  • Auth session handling: AuthService session management refactored; LikeRepository integrated to support post-like state checks during session setup.

Removed

  • sync_mongo.py MongoDB-to-PostgreSQL user data synchronisation script (migration complete; no longer needed).
  • Redundant IAPService test file removed; all tests consolidated in test_iap_service.py.

[0.2.10] - 2026-06-05

Compare: 0.2.9...0.2.10

Added

  • Content export router: Wired the content export router into the FastAPI application, making the media-library CSV export endpoints (job creation, status polling, and download) fully reachable in the running server.
  • Album details — optional content type: getAlbumDetails endpoint updated so the contentType filter parameter is now truly optional, allowing callers to fetch full album details without specifying a content type.

Changed

  • Artists report API: StatsService and ArtistsReportService enriched with comprehensive type hints; artist-filtering logic in report generation improved for accuracy; report generation API updated to reflect the revised service interface.
  • Google Vision moderation: Google Vision moderation service further enhanced alongside the 0.2.10 environment configuration update.

Fixed

  • OTP verification — universal OTP: OTP verification logic updated to correctly recognise and handle the universal OTP setting, and to guarantee that a request ID is always generated before the OTP is validated.
  • OTP session persistence: OTP request is now explicitly persisted to the database session before the verification response is returned, preventing a session rollback from silently discarding the record.
  • Production house migration: Corrected a column name syntax error in the SQL migration that replaces productionHouse with label in the audio_credits table.

[0.2.9] - 2026-06-04

Compare: 0.2.8...0.2.9

Added

  • FCM / Push notifications: Enhanced FCM token management with subscription synchronization and previous-token tracking; backfill script to register existing device tokens against Firebase topics.
  • User playback analytics: PlaybackRepository integrated into UserService and AppEventsService; get_me for free-plan users now returns session and listening-activity data alongside profile information.
  • Monthly plays API: New endpoint returning per-content monthly play counts; content plays service refactored for improved aggregation and data handling.
  • App events: Background task handling for app-event processing; ad events now distinguished from regular events in processing logic; event persistence (db_persist) moved from hardcoded value to a configuration setting; improved event saving and retry logic.
  • Content export API: Media library CSV export with job creation, status polling, and download endpoints — enables bulk data extraction from the studio content library.
  • Lyricist mapping backfill: Processor that reads an Excel file and backfills lyricist assignments in audio credits for existing tracks.
  • YouTube publishing: Support for custom titles, descriptions, and thumbnails in YouTube video uploads via the social publishing service.
  • Instagram / Facebook improvements: Instagram user polling token retrieval added; Facebook page access token resolution improved; unnecessary token-expiration logic removed from both SocialPublishService and TokenManagerService; Facebook page-not-found exception handled gracefully; social account sync timeout increased.
  • Google Vision content moderation: Google Vision moderation service integrated for social post image validation before publishing; moderation status and result fields added to the social_posts table.
  • Filterable playlists: Filterable fields (search, sort, filter operators) added to the Playlists CRUD router.
  • Album enhancements: getAlbumDetails now accepts a contentType parameter; isTranscoded filter added to AlbumCRUDRouter; content album service handles missing content references gracefully.
  • ArtistContentService: Lead artist transformation logic improved; new service methods to fetch an artist's latest releases and following status from the calling user's perspective.
  • Artist & claim APIs: Additional-details submission and retrieval endpoints added; admin claim-management API; Simple OTP phone verification flow; email template service with HTML notifications for applications and claims.
  • Identity verification: Aadhaar and live-photo fields on artist applications with service-layer persistence.
  • Artists report: Background CSV report generation for the admin panel with a dedicated download endpoint.
  • GetStream / live: Live chat notifications for artists; livestream handling updates; chat token endpoint; StreamSyncService consolidation replacing scattered direct service calls.
  • Social publishing (G-Amplify): Full Social Publishing API — connections management, scheduled post CRUD, manual Facebook page connect, presigned social-media upload URL, tags column on social_posts, publishers for Instagram / Facebook / LinkedIn / X (Twitter), retry for failed platform posts, OAuth 1 support for X, Jinja2 template integration for amplify flows, G-Amplify endpoint.
  • Audio credits: Label and publisher filters on album and content APIs; SQL migrations replacing productionHouse designation with label in audio_credits table and dropping copyright-year columns.
  • Subscription plans page API: New endpoint dedicated to the subscription plans display page; response model updated to SubscriptionPlanDetailResponse.
  • Subscription plan display: Enhanced defaults and seed data on subscription_plan_display table.
  • Explicit session commits: session.commit() calls added across multiple services to ensure database writes are persisted reliably rather than relying on implicit flush.
  • Ops scripts: Script to list and delete orphaned Celery SQS queues.
  • UNION ALL query optimisation: Song-count query for artist credits rewritten using UNION ALL for improved performance.

Changed

  • PlaybackRepository replaces AppEventsRepository: Dashboard and spotlight services now use PlaybackRepository for live listener and playback data; corresponding unit tests updated.
  • Collaborator filter removed from content queries: Filter commented out across album, content, and related services to streamline queries while a revised approach is determined.
  • OTP background work: App type included in OTP background task; free-subscription attachment managed within the same flow.
  • User service simplifications: UserService instantiation streamlined; user update logic now passes the update payload directly to the repository; unused SettingsRepository removed.
  • Artist ID normalisation: Custom inline artist-ID normalisation replaced with a shared utility function for consistency across services.
  • SocialPublishService.disconnect: Now returns the deleted social-account snapshot instead of the updated status object, giving callers richer context on what was removed.
  • DRM service JWT decode: Updated to use decode_unsafe_token for DRM authorization flows.
  • Utility imports: Import paths for file utility functions and other shared helpers updated across multiple services for clarity and consistency.
  • Dropped artist_application table: Legacy table removed; application flows consolidated on the current schema.
  • Production-house filters renamed to label: audioCreditsProductionHouse filter parameters renamed to audioCreditsLabel throughout album and content APIs; publisher filters added in parallel.
  • Facebook credentials: FACEBOOK_APP_ID / FACEBOOK_APP_SECRET env vars replaced with META_APP_ID / META_APP_SECRET.
  • g-backend-sdk stage reference: Stage (stage.in) requirements updated to track the develop branch of the SDK (0.1.107-rc2).
  • Reverted GetStream experiment: Interim PR #382 (subscription-plan/notification enhancements via GetStream) reverted; targeted live-chat and GetStream fixes introduced separately are retained.

Removed

  • Revenue runner script and its associated CLI entry point.
  • Deprecated playback_service.py — functionality absorbed by PlaybackRepository.
  • Deprecated user profile settings endpoints and related settings-API logic.
  • User management endpoints temporarily removed (to be re-introduced with revised design).
  • Unused timedelta import from spotlight_service.py.

Fixed

  • appType corrected in live_service and notification_service to reflect the proper application context.
  • JSON formatting error in the main workspace configuration file.
  • Social publish API error responses now consistently use ErrorDetailSchema instead of an ad-hoc dict shape.
  • Unused imports cleaned up in google_iap_api.py.

[0.2.8] - 2026-05-21

Compare: 0.2.7...0.2.8

Added

  • IP2Location geolocation service: Integrated the IP2Location database for server-side geolocation lookups; added dedicated endpoints for client IP lookups and arbitrary IP queries. IP2Location database files relocated to the constraints/ directory and all references updated accordingly.
  • Subscription plan display table: New subscription_plan_display table with initial seed data and indexes; backed by a full CRUD service layer so plans can be managed without schema changes.
  • GIN index on audioFeatures: Added a GIN index on the audioFeatures JSONB column in the contents table for significantly faster audio-feature queries.
  • Vendor upload task cancellation: Incomplete vendor upload tasks can now be cancelled programmatically, allowing operators to trigger a clean manual restart without database surgery.

Changed

  • Apple IAP — app account token: app_account_token renamed to incoming_app_account_token throughout the Apple IAP validation path and related tests for clarity on its role as an inbound value.
  • Referral URL generation: User details (name, identifier) are now embedded in referral URLs to improve referrer identification on the receiving end.
  • Backend SDK bumped to 0.1.106.

Fixed

  • Removed stale type: ignore comments from IP2Location imports and tightened error handling in the geolocation service so type errors surface at lint time rather than silently at runtime.

[0.2.7] - 2026-05-19

Compare: 0.2.6...0.2.7

Added

  • audioFeatures column on contents: New JSONB column stores audio feature data (key, BPM, energy, etc.) directly on content records, enabling audio-feature-driven queries and filtering.
  • Countries table rebuild: countries table recreated with proper constraints, foreign keys, and indexes for data integrity; migration adds enhanced fields (ISO codes, region, calling code) and seeds the full country list.
  • IAP country code & period type: Both Apple and Google IAP service methods now accept and persist countryCode and periodType, giving subscription records accurate geographic and billing-cycle context.
  • Apple IAP — period_type parameter: Added period_type to Apple IAP transaction validation and subscription-sync methods so intro/promotional period handling is correctly reflected in the subscription record.
  • Apple IAP — upcoming user ID handling: Transaction validation now processes the upcoming_user_id field from Apple's server notifications, enabling pre-emptive subscription transfers before they take effect.
  • Google Play subscription ownership validation: New endpoint and service method to verify that a given Google Play purchase token belongs to the authenticated user.
  • Google Play purchase ownership resolution: IAPService can now resolve the owner of a Google Play purchase from the Google order ID; backfill job added to repair invoice pricing charges on existing transactions.
  • Google order ID normalisation: Normalization logic added to handle multiple Google order ID formats; subscription owner recovery from a user's Google email address implemented with corresponding tests.
  • Google IAP — resubscribe context preservation: Webhook handler now carries resubscribe context through to the acknowledgment step, preventing loss of resubscription metadata in the Google IAP event flow; unit test added.
  • Unresolved subscription owner handling: IAP service gracefully handles the case where a subscription owner cannot be resolved, logging the event and surfacing a structured error rather than crashing the webhook.
  • Apple & Google ownership validation endpoints: Dedicated REST endpoints for clients to validate subscription ownership for both platforms, backed by new service methods.
  • CORS middleware: CORS middleware added to allow cross-origin requests; vendor upload maximum row limit increased from 500 to 2,000 rows.
  • Deployment: version migration handling: Deployment script now detects version mismatches during migration runs and surfaces enhanced error messages to make failed upgrades easier to diagnose.

Changed

  • IAP service divisor constants: Hard-coded divisor values moved to application settings; payment amount calculation logic improved for correctness across currencies.
  • IAP country & period type from payload: Country code and period type are now derived directly from the inbound transaction payload rather than being looked up separately, reducing round trips.
  • Apple & Google IAP webhooks — session context: Webhook handlers refactored to use an explicit DB session context, improving transaction isolation and error recovery.
  • Transaction service charge validation: Divisor included in the charge validation step to ensure amounts in minor units are correctly validated before being stored.
  • Google Play period type: Period type support propagated through Google Play subscription validation and all downstream services that consume the subscription record.
  • Deployment script DATABASE_URL handling: Environment variable loading made safer — DATABASE_URL is now read and exported in a way that prevents shell-expansion issues on strings containing special characters.
  • Deployment scripts refactored: Migration scripts versioned under 0.2.7; deployment workflow updated to include countries-table and audio-features migrations in the correct order.
  • Homepage & root endpoint: Landing page title updated; root-endpoint logic streamlined to reduce boilerplate.
  • Backend SDK: Bumped to 0.1.105 in production; staging tracked through 0.1.105-rc10.1.105-rc11 during the release candidate cycle.

Fixed

  • Razorpay invoice generation: Edge cases in tax-payload construction corrected; invoice generation task enqueueing fixed; error reporting improved for failed attempts.
  • GoogleIAPErrorGoogleIapException: Incorrect exception class replaced across IAPService and the Google IAP webhook service so exception handling is consistent with the SDK.
  • IAP webhook error responses: Apple and Google IAP webhook handlers now return structured error responses and log failures with enough context for post-incident debugging.

[0.2.6] - 2026-05-14

Compare: 0.2.5...0.2.6

Added

  • RazorpayHostedInvoiceService: New service for managing Razorpay hosted invoices — creates, issues, and cancels invoices as part of the subscription payment lifecycle.
  • Google IAP support: Full Google Play in-app purchase flow — webhook handler, server-side purchase validation, and transaction creation (amounts stored in minor units).
  • Invoice generation task enqueueing in the Razorpay webhook service so invoice work is dispatched asynchronously after payment events.
  • Invoice task management in the Razorpay webhook service to track and reconcile pending invoice jobs.
  • Google and Apple product IDs exposed in subscription plan detail responses.
  • Subscription resolution and service-period backfilling in TransactionService so existing transactions gain correct period metadata retroactively.
  • Service-period formatting helpers across IAPService and TransactionService for consistent period display.
  • pg_trgm PostgreSQL extension enabled via migration to power fuzzy text-similarity search.
  • Payment Gateway Plans CRUD: New endpoints and service layer for managing gateway-specific subscription plans.
  • totalSongs field added to artist responses; ArtistCRUDRouter sorting logic enhanced to support it.
  • Migration scripts to convert PaymentMethodPaymentMethodType and to backfill gdpZoneId / periodId on existing UserSubscriptions rows.
  • Unit tests for CRUDRouter extended filter operators (regex and fuzzy similarity).

Changed

  • Subscription service enhanced with GDP zone and period resolution, pricing breakdown, tax handling, and verified-payment processing for both Razorpay and IAP flows.
  • Razorpay subscription handling updated with improved cycle-count logic and support for one-time and recurring plan variants.
  • IAP service updated to handle payment amounts in subunits (Apple and Google) and to sync expired subscriptions during reconciliation.
  • Transaction currency fields normalised in the Razorpay webhook service for consistent downstream processing.
  • User email validation tightened in the subscription service; user update logic improved to handle partial field changes more reliably.
  • Lead artist transformation refactored for reuse; live-event content retrieval updated accordingly.
  • Backend SDK bumped to 0.1.104.

Fixed

  • Capped Razorpay maximum subscription duration at 5 years to prevent out-of-range plan creation.
  • Removed hardcoded error message from validate_google_iap_purchase — errors now propagate the actual upstream message.
  • Improved "user not found" error messages in AuthService for clearer client-side diagnostics.

Refactored

  • ErrorDetail renamed to ErrorDetailSchema in Google IAP API usage, matching the SDK-level rename.
  • Type annotations cleaned up across subscription and transaction services.
  • Removed unused method from UserCRUDRouter; subscription status handling streamlined.

[0.2.5] - 2026-05-08

Compare: 0.2.4...0.2.5

Added

  • MergeJobStore (apps/studio/services/merge_job_store.py): Redis-backed job store for PDL metadata merge jobs, replacing the previous in-memory MERGE_JOBS dict. Job metadata is keyed at merge_job:{job_id} with a 1-hour TTL; merged CSV bytes are stored separately at merge_job_csv:{job_id} (base64-encoded) with a 5-minute TTL. Provides create, update, get, store_csv, get_csv, mark_completed, mark_failed, cancel, and is_cancelled async methods.
  • MergeJobStore.for_thread() class method that creates a store with a fresh Redis connection (bypassing the lru_cache singleton) for safe use inside sync background tasks running their own event loop.

Changed

  • PDL merge background task and all four merge endpoints (start, status, cancel, download) migrated from the in-memory MERGE_JOBS dict to MergeJobStore, making job state visible across all Gunicorn workers.
  • Download endpoint now reads CSV bytes from Redis instead of process memory; returns 404 with a clear message if the 5-minute CSV TTL has elapsed.

Fixed

  • Background task event-loop conflict under multi-worker Gunicorn: the task now creates its own asyncio event loop and a dedicated Redis connection via MergeJobStore.for_thread(), avoiding "Future attached to a different loop" errors caused by the shared singleton client.

[0.2.4] - 2026-05-08

Compare: 0.2.3...0.2.4

Added

  • PDL Metadata Merge: New REST endpoints to start, poll, and cancel PDL metadata merge jobs — /system/pdl-merge/start, /system/pdl-merge/status/{job_id}, and /system/pdl-merge/cancel/{job_id}.
  • In-memory job store: Merge job states and progress are tracked in memory so clients can poll for real-time status without hitting the database.
  • PDL merge logic migrated from a standalone script into the VendorUploadService, enabling S3 integration and on-the-fly CSV generation directly from the service layer.
  • Enhanced error handling and structured logging throughout the merge pipeline for better traceability when processing large PDL datasets.

Changed

  • Backend SDK bumped to 0.1.102.

[0.2.3] - 2026-05-06

Compare: 0.2.2...0.2.3

Added

  • User app settings are now auto-created on first fetch — the new get_or_create_user_settings path eliminates 404 errors on fresh accounts and removes the need for a separate creation step.
  • Artist chat token is generated and saved to the artist's profile during GetStream chat channel creation, so the token persists across sessions and is always consistent with the stored channel details.
  • Album CRUD now supports filtering by audioCreditsDistributor and audioCreditsProductionHouse — these filters query nested content audio-credit records to locate albums where a specific artist appears in those credit roles.
  • Live event artist responses now include an isLive: true flag, so clients no longer need to infer live status from context.
  • Tasks/Jobs: Subscription expiry reconciliation periodic task that runs every 10 minutes (configurable via SUBSCRIPTION_EXPIRY_RECONCILE_INTERVAL), proactively marking overdue subscriptions as Expired to keep read-time checks accurate.
  • Tasks/Jobs: Bulk review handler for content and event approvals, allowing moderators to approve or reject multiple items in a single request.
  • Tasks/Jobs: Custom notification delivery update task for tracking and persisting notification status changes.
  • Tasks/Jobs: Vendor upload processing now copies album group thumbnails and tracks source file paths through the pipeline.
  • Tasks/Jobs: Missing playlist thumbnails are now auto-generated as part of vendor upload post-processing.

Changed

  • Lead artist transformation refactored to reuse a single LeadArtistsTransformer instance and a shared artists map per request, reducing redundant database fetches when rendering live-event artist listings.
  • Backend SDK updated to 0.1.101 across both production and staging.
  • Removed the unused HundredMsWebhookService and cleaned up stale imports in the AWS webhook service.
  • Tasks/Jobs: Album upsert context added to vendor upload processing so re-uploaded albums correctly update existing records instead of creating duplicates.
  • Tasks/Jobs: Vendor upload error reporting enhanced with more detailed messages, stricter header validation, and deferred content linking to improve reliability on large batches.

Fixed

  • Corrected folder names in the workspace configuration file.

[0.2.2] - 2026-04-27

Compare: 0.2.1...0.2.2

Added

  • Added new user analytics endpoints so the admin panel can show per-user insights — including when a user listens most, how many hours they use the app, their listening habits (plays, skips, completions), top genres, favourite artists, how they discover tracks, and a content-type breakdown.
  • End dates on all analytics queries are now treated as inclusive, so filtering "up to April 27" returns data for the full day of April 27.

Changed

  • Improved invoice and payment details handling in the transaction service — tax details are now backfilled from the user's active subscription when missing from invoice data, so transaction records are more complete.
  • Improved subscription service to pull payment method details from recent transactions when they are not directly available, reducing gaps in payment history.
  • Improved Razorpay webhook handling with better error recovery and more complete payment detail fetching.
  • Added upcCode to album search fields in the album CRUD router.
  • Updated backend SDK reference requirements to 0.1.100.

Fixed

  • Fixed shared cache entries not being cleared after create, update, or delete operations, which could cause stale data to be returned.
  • Fixed idle transaction risk by committing status changes before external API calls.

[0.2.1] - 2026-04-23

Compare: 0.2.0...0.2.1

Fixed

  • Fixed a crash in the OTP request flow that occurred when no matching user was found — the service now handles this case gracefully instead of raising an error.

[0.2.0] - 2026-04-23

Compare: 0.1.2...develop-new

Added

  • Expand CRUD tooling with request context propagation, richer sorting, new filter operators, audit logging, and dedicated artist app-event CRUD support.
  • Add studio event CRUD and tracking flows, new album created_at filters, event-ticket wiring, and hard-delete cleanup for same-day contents and albums.
  • Add richer custom notification capabilities with age-group targeting, gesture playback app settings support, and starCast exposure in content and search responses.
  • Add an Alembic migration that converts users.gender from PostgreSQL enum storage to integer-backed values while repairing existing rows during the upgrade.

Changed

  • Bump the application version to 0.2.0.
  • Refactor custom notification services and tighten dashboard query handling, including user creation-date filters in consolidated statistics.
  • Move the backend SDK dependency to 0.1.99 and align backend user-gender persistence with the SDK's integer-backed model.

Fixed

  • Fix custom notification behavior after the service refactor.
  • Align staging SDK dependency updates required by the 0.2.0 branch train.
  • Fix gender demographic labeling and legacy Mongo-to-PostgreSQL user gender remapping to match the new integer representation.

[0.1.2] - 2026-04-22

Compare: 0.1.1...0.1.2

Fixed

  • Repair automated deployment after the 0.1.1 release cut.

[0.1.1] - 2026-04-22

Compare: 0.1.0...0.1.1

Added

  • Add vendor-upload ingestion and PDL processing, along with direct database checks for incomplete uploads.
  • Add featured video URL support for artists and contents, web-view token generation and verification, playlist reordering hooks, referral balance endpoints, dynamic artist referral URLs, default artist profile images, and file-browser support.
  • Introduce studio event APIs with new query parameters and schema/index work, plus bulk content and event moderation improvements and collaborator-aware content queries.

Changed

  • Refresh mobile-app details behavior and notification subscription handling while the backend SDK moved through the 0.1.96 to 0.1.98 train.
  • Improve deployment workflow automation and release version handling ahead of the 0.1.1 and 0.1.2 releases.

Fixed

  • Fix non-published content approval, media status updates, referral and refund issues, force-update logic, phone-normalization conflicts, and deployment workflow problems.

[0.1.0] - 2026-03-28

Added

  • Launch the FastAPI and SQLModel backend foundation with modular apps for auth, content, artists, studio, registry, analytics, billing, getstream, and webhooks.
  • Implement OTP authentication, token and logout flows, user CRUD, content, album, artist, studio, events, notifications, and dashboard APIs, plus health and landing pages.
  • Add MongoDB-to-PostgreSQL migration tooling, playlist caching, share-link improvements, transaction detail responses, artist app-event background tasks, media-processing utilities, and private-SDK-aware CI and deployment automation.

Changed

  • Restructure the codebase from its early monolithic layout into modular g core packages and service-specific FastAPI apps.
  • Harden deployment scripts and GitHub Actions for environment-specific releases, private dependency access, ownership fixes, and release validation.

Fixed

  • Resolve template rendering issues, payment-gateway plan validation, share-link payload handling, restore and deployment scripts, and server permission problems.