@stacksjs/defaults 0.70.58 → 0.70.60
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/app/Actions/AI/AskAction.ts +40 -0
- package/app/Actions/AI/SummaryAction.ts +40 -0
- package/app/Actions/Auth/AuthUserAction.ts +13 -0
- package/app/Actions/Auth/CreateTokenAction.ts +64 -0
- package/app/Actions/Auth/DisableTwoFactorAction.ts +37 -0
- package/app/Actions/Auth/EnableTwoFactorAction.ts +37 -0
- package/app/Actions/Auth/GenerateAuthenticationAction.ts +51 -0
- package/app/Actions/Auth/GenerateRegistrationAction.ts +53 -0
- package/app/Actions/Auth/GenerateTwoFactorSecretAction.ts +26 -0
- package/app/Actions/Auth/ListTokensAction.ts +30 -0
- package/app/Actions/Auth/LoginAction.ts +73 -0
- package/app/Actions/Auth/LogoutAction.ts +16 -0
- package/app/Actions/Auth/LogoutAllAction.ts +28 -0
- package/app/Actions/Auth/RefreshTokenAction.ts +39 -0
- package/app/Actions/Auth/RegisterAction.ts +57 -0
- package/app/Actions/Auth/ResendVerificationAction.ts +24 -0
- package/app/Actions/Auth/RevokeTokenAction.ts +43 -0
- package/app/Actions/Auth/TestAbilitiesAction.ts +61 -0
- package/app/Actions/Auth/VerifyAuthenticationAction.ts +94 -0
- package/app/Actions/Auth/VerifyEmailAction.ts +25 -0
- package/app/Actions/Auth/VerifyRegistrationAction.ts +59 -0
- package/app/Actions/Auth/VerifyTwoFactorLoginAction.ts +57 -0
- package/app/Actions/Billable/CheckoutAction.ts +25 -0
- package/app/Actions/Buddy/BuddyBrowseAction.ts +34 -0
- package/app/Actions/Buddy/BuddyCancelAction.ts +32 -0
- package/app/Actions/Buddy/BuddyCommitAction.ts +25 -0
- package/app/Actions/Buddy/BuddyGitHubConnectAction.ts +40 -0
- package/app/Actions/Buddy/BuddyGitHubDisconnectAction.ts +19 -0
- package/app/Actions/Buddy/BuddyProcessAction.ts +65 -0
- package/app/Actions/Buddy/BuddyProcessStreamAction.ts +128 -0
- package/app/Actions/Buddy/BuddyPushAction.ts +21 -0
- package/app/Actions/Buddy/BuddyRepoOpenAction.ts +44 -0
- package/app/Actions/Buddy/BuddyRepoValidateAction.ts +35 -0
- package/app/Actions/Buddy/BuddySettingsAction.ts +21 -0
- package/app/Actions/Buddy/BuddySettingsUpdateAction.ts +46 -0
- package/app/Actions/Buddy/BuddyStateAction.ts +28 -0
- package/app/Actions/Buddy/BuddyTitleAction.ts +49 -0
- package/app/Actions/Buddy/CommandsAction.ts +802 -0
- package/app/Actions/Buddy/JobCancelAction.ts +32 -0
- package/app/Actions/Buddy/JobRetryAction.ts +49 -0
- package/app/Actions/Buddy/JobsListAction.ts +141 -0
- package/app/Actions/Buddy/ScheduleListAction.ts +52 -0
- package/app/Actions/Buddy/VersionsAction.ts +12 -0
- package/app/Actions/Cms/AuthorDestroyAction.ts +21 -0
- package/app/Actions/Cms/AuthorIndexAction.ts +14 -0
- package/app/Actions/Cms/AuthorShowAction.ts +19 -0
- package/app/Actions/Cms/AuthorStoreAction.ts +20 -0
- package/app/Actions/Cms/AuthorUpdateAction.ts +24 -0
- package/app/Actions/Cms/CategorizableDestroyAction.ts +16 -0
- package/app/Actions/Cms/CategorizableIndexAction.ts +14 -0
- package/app/Actions/Cms/CategorizableShowAction.ts +16 -0
- package/app/Actions/Cms/CategorizableStoreAction.ts +42 -0
- package/app/Actions/Cms/CategorizableUpdateAction.ts +38 -0
- package/app/Actions/Cms/CommentDestroyAction.ts +16 -0
- package/app/Actions/Cms/CommentIndexAction.ts +17 -0
- package/app/Actions/Cms/CommentShowAction.ts +16 -0
- package/app/Actions/Cms/CommentStoreAction.ts +39 -0
- package/app/Actions/Cms/CommentUpdateAction.ts +37 -0
- package/app/Actions/Cms/PageDestroyAction.ts +16 -0
- package/app/Actions/Cms/PageIndexAction.ts +14 -0
- package/app/Actions/Cms/PageStoreAction.ts +31 -0
- package/app/Actions/Cms/PageUpdateAction.ts +27 -0
- package/app/Actions/Cms/PostDestroyAction.ts +17 -0
- package/app/Actions/Cms/PostIndexAction.ts +14 -0
- package/app/Actions/Cms/PostShowAction.ts +16 -0
- package/app/Actions/Cms/PostStoreAction.ts +37 -0
- package/app/Actions/Cms/PostUpdateAction.ts +32 -0
- package/app/Actions/Cms/PostViewsUpdateAction.ts +34 -0
- package/app/Actions/Cms/RssFeedAction.ts +59 -0
- package/app/Actions/Cms/SitemapAction.ts +60 -0
- package/app/Actions/Cms/TaggableDestroyAction.ts +16 -0
- package/app/Actions/Cms/TaggableIndexAction.ts +14 -0
- package/app/Actions/Cms/TaggableShowAction.ts +16 -0
- package/app/Actions/Cms/TaggableStoreAction.ts +36 -0
- package/app/Actions/Cms/TaggableUpdateAction.ts +37 -0
- package/app/Actions/Commerce/CouponDestroyAction.ts +18 -0
- package/app/Actions/Commerce/CouponIndexAction.ts +16 -0
- package/app/Actions/Commerce/CouponShowAction.ts +18 -0
- package/app/Actions/Commerce/CouponStoreAction.ts +21 -0
- package/app/Actions/Commerce/CouponUpdateAction.ts +31 -0
- package/app/Actions/Commerce/CustomerDestroyAction.ts +16 -0
- package/app/Actions/Commerce/CustomerIndexAction.ts +15 -0
- package/app/Actions/Commerce/CustomerShowAction.ts +18 -0
- package/app/Actions/Commerce/CustomerStoreAction.ts +29 -0
- package/app/Actions/Commerce/CustomerUpdateAction.ts +27 -0
- package/app/Actions/Commerce/DriverDestroyAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardDestroyAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardIndexAction.ts +16 -0
- package/app/Actions/Commerce/GiftCardShowAction.ts +18 -0
- package/app/Actions/Commerce/GiftCardStatsAction.ts +30 -0
- package/app/Actions/Commerce/GiftCardStoreAction.ts +35 -0
- package/app/Actions/Commerce/GiftCardUpdateAction.ts +26 -0
- package/app/Actions/Commerce/GiftCardUpdateBalanceAction.ts +36 -0
- package/app/Actions/Commerce/OrderDestroyAction.ts +18 -0
- package/app/Actions/Commerce/OrderExportAction.ts +15 -0
- package/app/Actions/Commerce/OrderIndexAction.ts +15 -0
- package/app/Actions/Commerce/OrderShowAction.ts +18 -0
- package/app/Actions/Commerce/OrderStoreAction.ts +32 -0
- package/app/Actions/Commerce/OrderUpdateAction.ts +34 -0
- package/app/Actions/Commerce/PaymentDestroyAction.ts +16 -0
- package/app/Actions/Commerce/PaymentFetchStatsAction.ts +31 -0
- package/app/Actions/Commerce/PaymentIndexAction.ts +15 -0
- package/app/Actions/Commerce/PaymentMonthlyTrendsAction.ts +21 -0
- package/app/Actions/Commerce/PaymentShowAction.ts +17 -0
- package/app/Actions/Commerce/PaymentStoreAction.ts +24 -0
- package/app/Actions/Commerce/PaymentUpdateAction.ts +35 -0
- package/app/Actions/Commerce/PrintDeviceDestroyAction.ts +18 -0
- package/app/Actions/Commerce/PrintDeviceIndexAction.ts +14 -0
- package/app/Actions/Commerce/PrintDeviceShowAction.ts +17 -0
- package/app/Actions/Commerce/PrintDeviceStoreAction.ts +27 -0
- package/app/Actions/Commerce/PrintDeviceUpdateAction.ts +27 -0
- package/app/Actions/Commerce/Product/ManufacturerDestroyAction.ts +20 -0
- package/app/Actions/Commerce/Product/ManufacturerIndexAction.ts +16 -0
- package/app/Actions/Commerce/Product/ManufacturerShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ManufacturerStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductCategoryIndexAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductCategoryStoreAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductManufacturerIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerShowAction.ts +16 -0
- package/app/Actions/Commerce/Product/ProductManufacturerStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductManufacturerUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductStoreAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductUnitDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductUnitIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductUnitShowAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductUnitStoreAction.ts +15 -0
- package/app/Actions/Commerce/Product/ProductUpdateAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductVariantDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Product/ProductVariantIndexAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductVariantShowAction.ts +17 -0
- package/app/Actions/Commerce/Product/ProductVariantStoreAction.ts +14 -0
- package/app/Actions/Commerce/Product/ProductVariantUpdateAction.ts +16 -0
- package/app/Actions/Commerce/ReceiptDestroyAction.ts +18 -0
- package/app/Actions/Commerce/ReceiptIndexAction.ts +14 -0
- package/app/Actions/Commerce/ReceiptShowAction.ts +18 -0
- package/app/Actions/Commerce/ReceiptStoreAction.ts +28 -0
- package/app/Actions/Commerce/ReceiptUpdateAction.ts +30 -0
- package/app/Actions/Commerce/ReviewIndexAction.ts +14 -0
- package/app/Actions/Commerce/ReviewShowAction.ts +16 -0
- package/app/Actions/Commerce/ReviewStoreAction.ts +26 -0
- package/app/Actions/Commerce/ReviewUpdateAction.ts +28 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DeliveryRouteUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryDestroyAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryStoreAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DigitalDeliveryUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DriverIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DriverShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/DriverStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/DriverUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyDestroyAction.ts +20 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyIndexAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyShowAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyStoreAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/LicenseKeyUpdateAction.ts +18 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingMethodUpdateAction.ts +15 -0
- package/app/Actions/Commerce/Shipping/ShippingRateDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingRateShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingRateUpdateAction.ts +17 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneDestroyAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneIndexAction.ts +14 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneShowAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneStoreAction.ts +16 -0
- package/app/Actions/Commerce/Shipping/ShippingZoneUpdateAction.ts +15 -0
- package/app/Actions/Commerce/TaxRateDestroyAction.ts +16 -0
- package/app/Actions/Commerce/TaxRateIndexAction.ts +14 -0
- package/app/Actions/Commerce/TaxRateShowAction.ts +17 -0
- package/app/Actions/Commerce/TaxRateStoreAction.ts +24 -0
- package/app/Actions/Commerce/TaxRateUpdateAction.ts +24 -0
- package/app/Actions/Commerce/WaitlistProductAnalyticsAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistProductDestroyAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistProductIndexAction.ts +14 -0
- package/app/Actions/Commerce/WaitlistProductQuantityDistributionAction.ts +32 -0
- package/app/Actions/Commerce/WaitlistProductShowAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistProductStatusAction.ts +37 -0
- package/app/Actions/Commerce/WaitlistProductStoreAction.ts +27 -0
- package/app/Actions/Commerce/WaitlistProductTimeSeriesAction.ts +25 -0
- package/app/Actions/Commerce/WaitlistProductUpdateAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistRestaurantDashboardAction.ts +29 -0
- package/app/Actions/Commerce/WaitlistRestaurantDestroyAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistRestaurantIndexAction.ts +14 -0
- package/app/Actions/Commerce/WaitlistRestaurantShowAction.ts +16 -0
- package/app/Actions/Commerce/WaitlistRestaurantStoreAction.ts +31 -0
- package/app/Actions/Commerce/WaitlistRestaurantUpdateAction.ts +33 -0
- package/app/Actions/ContactAction.ts +72 -0
- package/app/Actions/Dashboard/Actions/CreateAction.ts +11 -0
- package/app/Actions/Dashboard/Actions/GetActionCount.ts +12 -0
- package/app/Actions/Dashboard/Actions/GetActions.ts +19 -0
- package/app/Actions/Dashboard/Analytics/BlogAnalyticsAction.ts +58 -0
- package/app/Actions/Dashboard/Analytics/BrowserAnalyticsAction.ts +42 -0
- package/app/Actions/Dashboard/Analytics/CommerceAnalyticsAction.ts +64 -0
- package/app/Actions/Dashboard/Analytics/CountryAnalyticsAction.ts +41 -0
- package/app/Actions/Dashboard/Analytics/DeviceAnalyticsAction.ts +58 -0
- package/app/Actions/Dashboard/Analytics/EventAnalyticsAction.ts +90 -0
- package/app/Actions/Dashboard/Analytics/MarketingAnalyticsAction.ts +76 -0
- package/app/Actions/Dashboard/Analytics/PageAnalyticsAction.ts +45 -0
- package/app/Actions/Dashboard/Analytics/ReferrerAnalyticsAction.ts +72 -0
- package/app/Actions/Dashboard/Analytics/SalesAnalyticsAction.ts +73 -0
- package/app/Actions/Dashboard/Analytics/WebAnalyticsAction.ts +114 -0
- package/app/Actions/Dashboard/Auth/MeAction.ts +84 -0
- package/app/Actions/Dashboard/BuddyDashboardAction.ts +34 -0
- package/app/Actions/Dashboard/Ci/RepoRunJobsAction.ts +60 -0
- package/app/Actions/Dashboard/Ci/RepoRunsAction.ts +67 -0
- package/app/Actions/Dashboard/Ci/RunnerHistoryAction.ts +58 -0
- package/app/Actions/Dashboard/Ci/StatusAction.ts +73 -0
- package/app/Actions/Dashboard/Ci/failure-notifier.ts +214 -0
- package/app/Actions/Dashboard/Ci/runner-pressure-monitor.ts +259 -0
- package/app/Actions/Dashboard/Cloud/CloudIndexAction.ts +61 -0
- package/app/Actions/Dashboard/Commands/CreateCommand.ts +11 -0
- package/app/Actions/Dashboard/Commands/GetAverageCommandTime.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommandCount.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommandSuccessRate.ts +12 -0
- package/app/Actions/Dashboard/Commands/GetCommands.ts +12 -0
- package/app/Actions/Dashboard/Commerce/CommerceCouponsAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceCustomersAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceDashboardAction.ts +98 -0
- package/app/Actions/Dashboard/Commerce/CommerceDeliveryAction.ts +65 -0
- package/app/Actions/Dashboard/Commerce/CommerceGiftCardsAction.ts +48 -0
- package/app/Actions/Dashboard/Commerce/CommerceOrdersAction.ts +51 -0
- package/app/Actions/Dashboard/Commerce/CommercePaymentsAction.ts +59 -0
- package/app/Actions/Dashboard/Commerce/CommerceProductsAction.ts +50 -0
- package/app/Actions/Dashboard/Commerce/CommerceTaxesAction.ts +46 -0
- package/app/Actions/Dashboard/Commerce/PosIndexAction.ts +57 -0
- package/app/Actions/Dashboard/Commerce/ReviewIndexAction.ts +51 -0
- package/app/Actions/Dashboard/Content/AuthorIndexAction.ts +51 -0
- package/app/Actions/Dashboard/Content/CategoryIndexAction.ts +27 -0
- package/app/Actions/Dashboard/Content/CommentIndexAction.ts +41 -0
- package/app/Actions/Dashboard/Content/ContentDashboardAction.ts +54 -0
- package/app/Actions/Dashboard/Content/FileIndexAction.ts +24 -0
- package/app/Actions/Dashboard/Content/PageIndexAction.ts +25 -0
- package/app/Actions/Dashboard/Content/PostIndexAction.ts +102 -0
- package/app/Actions/Dashboard/Content/SeoIndexAction.ts +17 -0
- package/app/Actions/Dashboard/Content/TagIndexAction.ts +23 -0
- package/app/Actions/Dashboard/CreateDnsRecords.ts +11 -0
- package/app/Actions/Dashboard/CreateMailbox.ts +11 -0
- package/app/Actions/Dashboard/DashboardActivityAction.ts +58 -0
- package/app/Actions/Dashboard/DashboardHealthAction.ts +52 -0
- package/app/Actions/Dashboard/DashboardHomeAction.ts +83 -0
- package/app/Actions/Dashboard/DashboardStatsAction.ts +48 -0
- package/app/Actions/Dashboard/Data/AccessTokenIndexAction.ts +65 -0
- package/app/Actions/Dashboard/Data/ActivityIndexAction.ts +28 -0
- package/app/Actions/Dashboard/Data/DataDashboardAction.ts +67 -0
- package/app/Actions/Dashboard/Data/SubscriberIndexAction.ts +48 -0
- package/app/Actions/Dashboard/Data/TeamIndexAction.ts +43 -0
- package/app/Actions/Dashboard/Data/UserIndexAction.ts +48 -0
- package/app/Actions/Dashboard/Deployments/CreateDeployment.ts +11 -0
- package/app/Actions/Dashboard/Deployments/GetAverageDeploymentTime.ts +15 -0
- package/app/Actions/Dashboard/Deployments/GetDeployScript.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeploymentCount.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeploymentLiveTerminalOutput.ts +12 -0
- package/app/Actions/Dashboard/Deployments/GetDeployments.ts +20 -0
- package/app/Actions/Dashboard/Deployments/GetRecentDeployments.ts +12 -0
- package/app/Actions/Dashboard/Deployments/UpdateDeployScript.ts +11 -0
- package/app/Actions/Dashboard/GetDnsRecords.ts +12 -0
- package/app/Actions/Dashboard/GetEmailInboxes.ts +12 -0
- package/app/Actions/Dashboard/GetProjects.ts +13 -0
- package/app/Actions/Dashboard/GetRecentCommits.ts +13 -0
- package/app/Actions/Dashboard/Inbox/InboxIndexAction.ts +144 -0
- package/app/Actions/Dashboard/Inbox/InboxShowAction.ts +89 -0
- package/app/Actions/Dashboard/Infrastructure/CommandIndexAction.ts +18 -0
- package/app/Actions/Dashboard/Infrastructure/DnsIndexAction.ts +101 -0
- package/app/Actions/Dashboard/Infrastructure/EnvironmentIndexAction.ts +67 -0
- package/app/Actions/Dashboard/Infrastructure/InsightsAction.ts +29 -0
- package/app/Actions/Dashboard/Infrastructure/LogIndexAction.ts +50 -0
- package/app/Actions/Dashboard/Infrastructure/MailboxIndexAction.ts +85 -0
- package/app/Actions/Dashboard/Infrastructure/PermissionIndexAction.ts +54 -0
- package/app/Actions/Dashboard/Infrastructure/RequestIndexAction.ts +44 -0
- package/app/Actions/Dashboard/Infrastructure/ServerIndexAction.ts +101 -0
- package/app/Actions/Dashboard/Jobs/CreateJob.ts +11 -0
- package/app/Actions/Dashboard/Jobs/GetAverageJobTime.ts +12 -0
- package/app/Actions/Dashboard/Jobs/GetJobHistory.ts +12 -0
- package/app/Actions/Dashboard/Jobs/GetJobs.ts +11 -0
- package/app/Actions/Dashboard/Jobs/GetJobsPerMinute.ts +12 -0
- package/app/Actions/Dashboard/Jobs/JobIndexAction.ts +136 -0
- package/app/Actions/Dashboard/Jobs/JobRetryAction.ts +23 -0
- package/app/Actions/Dashboard/Jobs/JobStatsAction.ts +49 -0
- package/app/Actions/Dashboard/Kanban/BoardDestroyAction.ts +84 -0
- package/app/Actions/Dashboard/Kanban/BoardShowAction.ts +215 -0
- package/app/Actions/Dashboard/Kanban/BoardStoreAction.ts +98 -0
- package/app/Actions/Dashboard/Kanban/BoardUpdateAction.ts +96 -0
- package/app/Actions/Dashboard/Kanban/BoardsIndexAction.ts +81 -0
- package/app/Actions/Dashboard/Kanban/BoardsReorderAction.ts +80 -0
- package/app/Actions/Dashboard/Kanban/CardAssigneesSyncAction.ts +103 -0
- package/app/Actions/Dashboard/Kanban/CardCommentDestroyAction.ts +33 -0
- package/app/Actions/Dashboard/Kanban/CardCommentStoreAction.ts +82 -0
- package/app/Actions/Dashboard/Kanban/CardDestroyAction.ts +48 -0
- package/app/Actions/Dashboard/Kanban/CardLabelsSyncAction.ts +103 -0
- package/app/Actions/Dashboard/Kanban/CardShowAction.ts +122 -0
- package/app/Actions/Dashboard/Kanban/CardStoreAction.ts +112 -0
- package/app/Actions/Dashboard/Kanban/CardUpdateAction.ts +91 -0
- package/app/Actions/Dashboard/Kanban/CardsReorderAction.ts +148 -0
- package/app/Actions/Dashboard/Kanban/ColumnDestroyAction.ts +59 -0
- package/app/Actions/Dashboard/Kanban/ColumnStoreAction.ts +94 -0
- package/app/Actions/Dashboard/Kanban/ColumnUpdateAction.ts +89 -0
- package/app/Actions/Dashboard/Kanban/ColumnsReorderAction.ts +85 -0
- package/app/Actions/Dashboard/Kanban/LabelDestroyAction.ts +41 -0
- package/app/Actions/Dashboard/Kanban/LabelStoreAction.ts +70 -0
- package/app/Actions/Dashboard/Kanban/LabelUpdateAction.ts +83 -0
- package/app/Actions/Dashboard/Kanban/UsersListAction.ts +36 -0
- package/app/Actions/Dashboard/Library/CreateComponent.ts +11 -0
- package/app/Actions/Dashboard/Library/CreateFunction.ts +11 -0
- package/app/Actions/Dashboard/Library/DependencyIndexAction.ts +92 -0
- package/app/Actions/Dashboard/Library/GetAverageReleaseTime.ts +12 -0
- package/app/Actions/Dashboard/Library/GetComponents.ts +24 -0
- package/app/Actions/Dashboard/Library/GetComponentsDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetFunctions.ts +22 -0
- package/app/Actions/Dashboard/Library/GetFunctionsDownloadCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetReleaseCount.ts +12 -0
- package/app/Actions/Dashboard/Library/GetReleases.ts +28 -0
- package/app/Actions/Dashboard/Library/PackageIndexAction.ts +26 -0
- package/app/Actions/Dashboard/Marketing/CampaignIndexAction.ts +45 -0
- package/app/Actions/Dashboard/Marketing/ListIndexAction.ts +43 -0
- package/app/Actions/Dashboard/Marketing/SocialPostIndexAction.ts +47 -0
- package/app/Actions/Dashboard/Models/GetModels.ts +39 -0
- package/app/Actions/Dashboard/Models/GetSubscriberCount.ts +12 -0
- package/app/Actions/Dashboard/Models/GetUserCount.ts +12 -0
- package/app/Actions/Dashboard/Models/ModelShowAction.ts +131 -0
- package/app/Actions/Dashboard/Models/ModelsIndexAction.ts +169 -0
- package/app/Actions/Dashboard/Notifications/CreateNotification.ts +11 -0
- package/app/Actions/Dashboard/Notifications/GetAverageNotificationTime.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationCount.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationDeliveryRate.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotificationHistory.ts +12 -0
- package/app/Actions/Dashboard/Notifications/GetNotifications.ts +12 -0
- package/app/Actions/Dashboard/Notifications/NotificationDashboardAction.ts +43 -0
- package/app/Actions/Dashboard/Queries/QueryIndexAction.ts +22 -0
- package/app/Actions/Dashboard/Queue/QueueRetryFailedAction.ts +22 -0
- package/app/Actions/Dashboard/Queue/QueueStatsAction.ts +98 -0
- package/app/Actions/Dashboard/Queue/QueueWorkersAction.ts +46 -0
- package/app/Actions/Dashboard/Rbac/PermissionDestroyAction.ts +33 -0
- package/app/Actions/Dashboard/Rbac/PermissionStoreAction.ts +53 -0
- package/app/Actions/Dashboard/Rbac/PermissionsIndexAction.ts +34 -0
- package/app/Actions/Dashboard/Rbac/RoleDestroyAction.ts +35 -0
- package/app/Actions/Dashboard/Rbac/RolePermissionsShowAction.ts +45 -0
- package/app/Actions/Dashboard/Rbac/RolePermissionsSyncAction.ts +63 -0
- package/app/Actions/Dashboard/Rbac/RoleStoreAction.ts +58 -0
- package/app/Actions/Dashboard/Rbac/RolesIndexAction.ts +36 -0
- package/app/Actions/Dashboard/Rbac/UserRolesShowAction.ts +40 -0
- package/app/Actions/Dashboard/Rbac/UserRolesSyncAction.ts +65 -0
- package/app/Actions/Dashboard/Rbac/UsersListAction.ts +39 -0
- package/app/Actions/Dashboard/Realtime/RealtimeStatsAction.ts +50 -0
- package/app/Actions/Dashboard/Releases/ReleaseIndexAction.ts +21 -0
- package/app/Actions/Dashboard/Requests/GetAverageRequestTime.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequestCount.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequestSuccessRate.ts +12 -0
- package/app/Actions/Dashboard/Requests/GetRequests.ts +12 -0
- package/app/Actions/Dashboard/Search/GlobalSearchAction.ts +26 -0
- package/app/Actions/Dashboard/ServiceHealthAction.ts +243 -0
- package/app/Actions/Dashboard/Settings/MailSettingsGetAction.ts +20 -0
- package/app/Actions/Dashboard/Settings/MailSettingsUpdateAction.ts +10 -0
- package/app/Actions/Dashboard/Settings/SettingsIndexAction.ts +40 -0
- package/app/Actions/Dashboard/Settings/UpdateAiConfig.ts +27 -0
- package/app/Actions/Dashboard/Settings/UpdateAnalyticsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateAppConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateCacheConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateCliConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateCloudConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDatabaseConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDnsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateDocsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateEmailConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateEnvConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateErrorsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateFileSystemsConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateGitConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateHashingConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateLibraryConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateLoggerConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateNotificationConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdatePaymentConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdatePortsConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateQueueConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateSearchEngineConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateSecurityConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateServicesConfig.ts +38 -0
- package/app/Actions/Dashboard/Settings/UpdateStorageConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateTeamConfig.ts +11 -0
- package/app/Actions/Dashboard/Settings/UpdateUiConfig.ts +11 -0
- package/app/Actions/HealthAction.ts +112 -0
- package/app/Actions/InstallAction.ts +83 -0
- package/app/Actions/Locale/SetLocaleAction.ts +51 -0
- package/app/Actions/LogAction.ts +42 -0
- package/app/Actions/Logs/LogFetchStatsAction.ts +50 -0
- package/app/Actions/Logs/LogIndexOrmAction.ts +13 -0
- package/app/Actions/Logs/LogShowOrmAction.ts +17 -0
- package/app/Actions/Logs/LogStoreOrmAction.ts +16 -0
- package/app/Actions/Logs/LogUpdateOrmAction.ts +20 -0
- package/app/Actions/Monitoring/ErrorDestroyAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorGroupAction.ts +21 -0
- package/app/Actions/Monitoring/ErrorIgnoreAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorIndexAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorResolveAction.ts +25 -0
- package/app/Actions/Monitoring/ErrorShowAction.ts +19 -0
- package/app/Actions/Monitoring/ErrorStatsAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorTimelineAction.ts +14 -0
- package/app/Actions/Monitoring/ErrorUnresolveAction.ts +25 -0
- package/app/Actions/NotifyUser.ts +10 -0
- package/app/Actions/Password/PasswordResetAction.ts +54 -0
- package/app/Actions/Password/SendPasswordResetEmailAction.ts +66 -0
- package/app/Actions/Password/VerifyResetTokenAction.ts +27 -0
- package/app/Actions/Payment/CancelSubscriptionAction.ts +20 -0
- package/app/Actions/Payment/CreateCheckoutAction.ts +28 -0
- package/app/Actions/Payment/CreateInvoiceSubscription.ts +18 -0
- package/app/Actions/Payment/CreatePaymentIntentAction.ts +31 -0
- package/app/Actions/Payment/CreateSetupIntentAction.ts +20 -0
- package/app/Actions/Payment/CreateSubscriptionAction.ts +23 -0
- package/app/Actions/Payment/DeleteDefaultPaymentAction.ts +18 -0
- package/app/Actions/Payment/FetchActiveSubscriptionAction.ts +18 -0
- package/app/Actions/Payment/FetchDefaultPaymentMethodAction.ts +18 -0
- package/app/Actions/Payment/FetchPaymentCustomerAction.ts +18 -0
- package/app/Actions/Payment/FetchPaymentMethodsAction.ts +18 -0
- package/app/Actions/Payment/FetchProductAction.ts +15 -0
- package/app/Actions/Payment/FetchTransactionHistoryAction.ts +18 -0
- package/app/Actions/Payment/FetchUserSubscriptionsAction.ts +18 -0
- package/app/Actions/Payment/SetDefaultPaymentAction.ts +20 -0
- package/app/Actions/Payment/SetUserDefaultPaymentAction.ts +20 -0
- package/app/Actions/Payment/StorePaymentMethodAction.ts +20 -0
- package/app/Actions/Payment/StoreTransactionAction.ts +20 -0
- package/app/Actions/Payment/UpdateCustomerAction.ts +24 -0
- package/app/Actions/Payment/UpdateDefaultPaymentMethodAction.ts +18 -0
- package/app/Actions/Payment/UpdateSubscriptionAction.ts +22 -0
- package/app/Actions/Queue/FetchQueuesAction.ts +14 -0
- package/app/Actions/README.md +61 -0
- package/app/Actions/Realtime/FetchWebsocketsAction.ts +14 -0
- package/app/Actions/RobotsAction.ts +61 -0
- package/app/Actions/SendWelcomeEmail.ts +40 -0
- package/app/Actions/SitemapAction.ts +234 -0
- package/app/Actions/Storefront/AddToCartAction.ts +153 -0
- package/app/Actions/Storefront/CheckoutContactAction.ts +50 -0
- package/app/Actions/Storefront/CheckoutShippingAction.ts +61 -0
- package/app/Actions/Storefront/GetCartAction.ts +58 -0
- package/app/Actions/Storefront/PlaceOrderAction.ts +195 -0
- package/app/Actions/Storefront/SubmitReviewAction.ts +140 -0
- package/app/Actions/Storefront/UpdateCartItemAction.ts +83 -0
- package/app/Actions/Storefront/_shipping.ts +64 -0
- package/app/Actions/SubscriberEmailAction.ts +60 -0
- package/app/Actions/TestErrorAction.ts +163 -0
- package/app/Actions/UnsubscribeAction.ts +107 -0
- package/app/Actions/UploadTestAction.ts +57 -0
- package/app/Broadcasts/OrderShipped.ts +57 -0
- package/app/Commands/Inspire.ts +57 -0
- package/app/Commands/README.md +84 -0
- package/app/Commands.ts +38 -0
- package/app/Controllers/ComingSoonController.ts +9 -0
- package/app/Controllers/QueryController.ts +373 -0
- package/app/Events.ts +14 -0
- package/app/Gates.ts +107 -0
- package/app/Jobs/ExampleJob.ts +20 -0
- package/app/Jobs/ExampleTwoJob.ts +12 -0
- package/app/Jobs/PruneModelsJob.ts +61 -0
- package/app/Jobs/PruneQueryLogsJob.ts +51 -0
- package/app/Jobs/README.md +79 -0
- package/app/Jobs/SendCampaignJob.ts +201 -0
- package/app/Jobs/SendEmailJob.ts +52 -0
- package/app/Jobs/SendPasswordResetEmailJob.ts +44 -0
- package/app/Jobs/SyncSearchIndexJob.ts +64 -0
- package/app/Listener.ts +84 -0
- package/app/Listeners/Console.ts +22 -0
- package/app/Listeners/README.md +47 -0
- package/app/Mail/OrderConfirmation.ts +60 -0
- package/app/Mail/SubscriptionConfirmation.ts +41 -0
- package/app/Middleware/Abilities.ts +53 -0
- package/app/Middleware/Api.ts +26 -0
- package/app/Middleware/Auth.ts +59 -0
- package/app/Middleware/Can.ts +68 -0
- package/app/Middleware/Compress.ts +213 -0
- package/app/Middleware/Cors.ts +320 -0
- package/app/Middleware/Csrf.ts +224 -0
- package/app/Middleware/EnsureEmailIsVerified.ts +28 -0
- package/app/Middleware/Env.ts +24 -0
- package/app/Middleware/EnvDevelopment.ts +19 -0
- package/app/Middleware/EnvLocal.ts +19 -0
- package/app/Middleware/EnvNotDevelopment.ts +19 -0
- package/app/Middleware/EnvNotLocal.ts +19 -0
- package/app/Middleware/EnvNotProduction.ts +19 -0
- package/app/Middleware/EnvNotStaging.ts +19 -0
- package/app/Middleware/EnvProduction.ts +19 -0
- package/app/Middleware/EnvStaging.ts +19 -0
- package/app/Middleware/Guest.ts +25 -0
- package/app/Middleware/Logger.ts +20 -0
- package/app/Middleware/Maintenance.ts +36 -0
- package/app/Middleware/Permission.ts +42 -0
- package/app/Middleware/README.md +48 -0
- package/app/Middleware/Role.ts +42 -0
- package/app/Middleware/Signed.ts +31 -0
- package/app/Middleware/Team.ts +36 -0
- package/app/Middleware/Throttle.ts +96 -0
- package/app/Middleware.ts +35 -0
- package/app/Models/Activity.ts +94 -0
- package/app/Models/Board.ts +103 -0
- package/app/Models/BoardColumn.ts +87 -0
- package/app/Models/Campaign.ts +239 -0
- package/app/Models/CampaignSend.ts +107 -0
- package/app/Models/Card.ts +117 -0
- package/app/Models/CardComment.ts +68 -0
- package/app/Models/Comment.ts +108 -0
- package/app/Models/Content/Author.ts +104 -0
- package/app/Models/Content/Page.ts +99 -0
- package/app/Models/Content/Post.ts +144 -0
- package/app/Models/Deployment.ts +116 -0
- package/app/Models/EmailList.ts +126 -0
- package/app/Models/EmailListSubscriber.ts +91 -0
- package/app/Models/Error.ts +70 -0
- package/app/Models/FailedJob.ts +62 -0
- package/app/Models/Job.ts +63 -0
- package/app/Models/Label.ts +66 -0
- package/app/Models/Log.ts +110 -0
- package/app/Models/Notification.ts +118 -0
- package/app/Models/PaymentMethod.ts +98 -0
- package/app/Models/PaymentProduct.ts +91 -0
- package/app/Models/PaymentTransaction.ts +78 -0
- package/app/Models/README.md +31 -0
- package/app/Models/Release.ts +89 -0
- package/app/Models/Request.ts +114 -0
- package/app/Models/SocialPost.ts +136 -0
- package/app/Models/Subscriber.ts +89 -0
- package/app/Models/SubscriberEmail.ts +55 -0
- package/app/Models/Subscription.ts +153 -0
- package/app/Models/Tag.ts +82 -0
- package/app/Models/Team.ts +72 -0
- package/app/Models/User.ts +134 -0
- package/app/Models/commerce/Cart.ts +139 -0
- package/app/Models/commerce/CartItem.ts +137 -0
- package/app/Models/commerce/Category.ts +105 -0
- package/app/Models/commerce/Coupon.ts +181 -0
- package/app/Models/commerce/Customer.ts +132 -0
- package/app/Models/commerce/DeliveryRoute.ts +93 -0
- package/app/Models/commerce/DigitalDelivery.ts +105 -0
- package/app/Models/commerce/Driver.ts +97 -0
- package/app/Models/commerce/GiftCard.ts +191 -0
- package/app/Models/commerce/LicenseKey.ts +87 -0
- package/app/Models/commerce/LoyaltyPoint.ts +107 -0
- package/app/Models/commerce/LoyaltyReward.ts +124 -0
- package/app/Models/commerce/Manufacturer.ts +84 -0
- package/app/Models/commerce/Order.ts +142 -0
- package/app/Models/commerce/OrderItem.ts +51 -0
- package/app/Models/commerce/Payment.ts +163 -0
- package/app/Models/commerce/PrintDevice.ts +117 -0
- package/app/Models/commerce/Product.ts +148 -0
- package/app/Models/commerce/ProductUnit.ts +107 -0
- package/app/Models/commerce/ProductVariant.ts +106 -0
- package/app/Models/commerce/Receipt.ts +128 -0
- package/app/Models/commerce/Review.ts +140 -0
- package/app/Models/commerce/ShippingMethod.ts +97 -0
- package/app/Models/commerce/ShippingRate.ts +74 -0
- package/app/Models/commerce/ShippingZone.ts +111 -0
- package/app/Models/commerce/TaxRate.ts +114 -0
- package/app/Models/commerce/Transaction.ts +126 -0
- package/app/Models/commerce/WaitlistProduct.ts +149 -0
- package/app/Models/commerce/WaitlistRestaurant.ts +187 -0
- package/app/Models/realtime/Websocket.ts +77 -0
- package/app/Notifications/README.md +31 -0
- package/app/Notifications/Welcome.ts +32 -0
- package/app/Policies/PostPolicy.ts +131 -0
- package/app/README.md +23 -0
- package/app/Routes.ts +47 -0
- package/app/Scheduler.ts +28 -0
- package/app/Storefront/CartCookie.ts +109 -0
- package/package.json +3 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { ask } from '@stacksjs/ai'
|
|
3
|
+
import { schema } from '@stacksjs/validation'
|
|
4
|
+
|
|
5
|
+
// TODO: this should have been auto-generated
|
|
6
|
+
interface Request {
|
|
7
|
+
question: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default new Action({
|
|
11
|
+
name: 'AiAskAction',
|
|
12
|
+
description: 'Ask AI',
|
|
13
|
+
method: 'POST',
|
|
14
|
+
|
|
15
|
+
validations: {
|
|
16
|
+
question: {
|
|
17
|
+
rule: schema.string().min(3).max(255),
|
|
18
|
+
message: 'The question must be between 3 and 255 characters long.',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async handle(request: Request) {
|
|
23
|
+
try {
|
|
24
|
+
const question = request.question
|
|
25
|
+
|
|
26
|
+
console.log(`Question received: ${question}`)
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
data: await ask(question),
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error:', error)
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
error: 'An error occurred while processing your request.',
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
})
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { summarize } from '@stacksjs/ai'
|
|
3
|
+
import { schema } from '@stacksjs/validation'
|
|
4
|
+
|
|
5
|
+
// TODO: this should have been auto-generated
|
|
6
|
+
interface Request {
|
|
7
|
+
text: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default new Action({
|
|
11
|
+
name: 'AiSummaryAction',
|
|
12
|
+
description: 'Summary AI',
|
|
13
|
+
method: 'POST',
|
|
14
|
+
|
|
15
|
+
validations: {
|
|
16
|
+
text: {
|
|
17
|
+
rule: schema.string().min(3),
|
|
18
|
+
message: 'The text must be at least 3 characters long.',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async handle(request: Request) {
|
|
23
|
+
try {
|
|
24
|
+
const text = request.text
|
|
25
|
+
|
|
26
|
+
console.log(`Text received: ${text}`)
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
data: await summarize(text),
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Error:', error)
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
error: 'An error occurred while processing your request.',
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { response } from '@stacksjs/router'
|
|
3
|
+
|
|
4
|
+
export default new Action({
|
|
5
|
+
name: 'AuthUserAction',
|
|
6
|
+
description: 'Get the authenticated user',
|
|
7
|
+
method: 'GET',
|
|
8
|
+
async handle(request: RequestInstance) {
|
|
9
|
+
const user = await request.user()
|
|
10
|
+
|
|
11
|
+
return response.json(user)
|
|
12
|
+
},
|
|
13
|
+
})
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { createToken } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
import { schema } from '@stacksjs/validation'
|
|
5
|
+
|
|
6
|
+
export default new Action({
|
|
7
|
+
name: 'CreateTokenAction',
|
|
8
|
+
description: 'Create a new personal access token with custom scopes',
|
|
9
|
+
method: 'POST',
|
|
10
|
+
async handle(request: RequestInstance) {
|
|
11
|
+
const user = await request.user()
|
|
12
|
+
|
|
13
|
+
if (!user) {
|
|
14
|
+
return response.unauthorized('Authentication required')
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const name = request.get('name') || 'access-token'
|
|
18
|
+
const scopes = request.get('scopes') || ['*']
|
|
19
|
+
const expiresInMinutes = request.get('expires_in_minutes') || 60
|
|
20
|
+
|
|
21
|
+
await request.validate({
|
|
22
|
+
name: {
|
|
23
|
+
rule: schema.string().min(1).max(255).optional(),
|
|
24
|
+
message: {
|
|
25
|
+
min: 'Token name must be at least 1 character',
|
|
26
|
+
max: 'Token name must be at most 255 characters',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
// Parse scopes - can be array or comma-separated string
|
|
32
|
+
let scopeArray: string[] = ['*']
|
|
33
|
+
if (Array.isArray(scopes)) {
|
|
34
|
+
scopeArray = scopes
|
|
35
|
+
}
|
|
36
|
+
else if (typeof scopes === 'string') {
|
|
37
|
+
scopeArray = scopes.split(',').map(s => s.trim()).filter(Boolean)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const result = await createToken(user.id, name, scopeArray, {
|
|
42
|
+
expiresInMinutes: Number(expiresInMinutes) || 60,
|
|
43
|
+
withRefreshToken: true,
|
|
44
|
+
refreshExpiresInDays: 30,
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
return response.json({
|
|
48
|
+
access_token: result.plainTextToken,
|
|
49
|
+
refresh_token: result.refreshToken,
|
|
50
|
+
token_type: 'Bearer',
|
|
51
|
+
expires_in: result.expiresIn,
|
|
52
|
+
token: {
|
|
53
|
+
id: result.accessToken.id,
|
|
54
|
+
name: result.accessToken.name,
|
|
55
|
+
scopes: result.accessToken.scopes,
|
|
56
|
+
expires_at: result.accessToken.expiresAt?.toISOString() || null,
|
|
57
|
+
},
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
catch (error: any) {
|
|
61
|
+
return response.serverError(error.message || 'Failed to create token')
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { Auth, disableTwoFactor } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
import { schema } from '@stacksjs/validation'
|
|
5
|
+
|
|
6
|
+
export default new Action({
|
|
7
|
+
name: 'DisableTwoFactorAction',
|
|
8
|
+
description: 'Disable TOTP 2FA for the authenticated user, after re-confirming their password',
|
|
9
|
+
method: 'POST',
|
|
10
|
+
|
|
11
|
+
validations: {
|
|
12
|
+
password: {
|
|
13
|
+
rule: schema.string().min(1),
|
|
14
|
+
message: 'Password is required to disable two-factor authentication.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
async handle(request: RequestInstance) {
|
|
19
|
+
const user = await request.user()
|
|
20
|
+
if (!user)
|
|
21
|
+
return response.unauthorized('Unauthorized')
|
|
22
|
+
|
|
23
|
+
const password = request.get('password')
|
|
24
|
+
|
|
25
|
+
// Disabling 2FA weakens the account — require the password again
|
|
26
|
+
// rather than trusting the bearer token alone (a stolen/leaked
|
|
27
|
+
// token shouldn't be enough to turn off the second factor it's
|
|
28
|
+
// meant to help guard against).
|
|
29
|
+
const confirmed = await Auth.validate({ email: user.email, password })
|
|
30
|
+
if (!confirmed)
|
|
31
|
+
return response.unauthorized('Incorrect password')
|
|
32
|
+
|
|
33
|
+
await disableTwoFactor(user.id as number)
|
|
34
|
+
|
|
35
|
+
return response.json({ enabled: false })
|
|
36
|
+
},
|
|
37
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { consumePendingTwoFactorSecret, enableTwoFactor } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
import { schema } from '@stacksjs/validation'
|
|
5
|
+
|
|
6
|
+
export default new Action({
|
|
7
|
+
name: 'EnableTwoFactorAction',
|
|
8
|
+
description: 'Verify a TOTP setup code against the server-stashed pending secret and, if valid, enable 2FA',
|
|
9
|
+
method: 'POST',
|
|
10
|
+
|
|
11
|
+
validations: {
|
|
12
|
+
code: {
|
|
13
|
+
rule: schema.string().min(6).max(6),
|
|
14
|
+
message: 'Code must be a 6-digit TOTP code.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
async handle(request: RequestInstance) {
|
|
19
|
+
const user = await request.user()
|
|
20
|
+
if (!user)
|
|
21
|
+
return response.unauthorized('Unauthorized')
|
|
22
|
+
|
|
23
|
+
const code = request.get('code')
|
|
24
|
+
|
|
25
|
+
// The secret is never taken from the client — see
|
|
26
|
+
// GenerateTwoFactorSecretAction / two-factor.ts's doc comment.
|
|
27
|
+
const pendingSecret = await consumePendingTwoFactorSecret(user.id as number)
|
|
28
|
+
if (!pendingSecret)
|
|
29
|
+
return response.unauthorized('No pending setup found — please generate a new QR code and try again.')
|
|
30
|
+
|
|
31
|
+
const enabled = await enableTwoFactor(user.id as number, pendingSecret, code)
|
|
32
|
+
if (!enabled)
|
|
33
|
+
return response.unauthorized('Invalid code — please check your authenticator app and try again.')
|
|
34
|
+
|
|
35
|
+
return response.json({ enabled: true })
|
|
36
|
+
},
|
|
37
|
+
})
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { PublicKeyCredentialRequestOptionsJSON } from '@stacksjs/auth'
|
|
2
|
+
import { Action } from '@stacksjs/actions'
|
|
3
|
+
import {
|
|
4
|
+
generateAuthenticationOptions,
|
|
5
|
+
getUserPasskeys,
|
|
6
|
+
storeWebAuthnChallenge,
|
|
7
|
+
} from '@stacksjs/auth'
|
|
8
|
+
import { config } from '@stacksjs/config'
|
|
9
|
+
import { User } from '@stacksjs/orm'
|
|
10
|
+
|
|
11
|
+
export default new Action({
|
|
12
|
+
name: 'PasskeyAuthenticationAction',
|
|
13
|
+
description: 'Generate Passkey Authentication Options',
|
|
14
|
+
method: 'POST',
|
|
15
|
+
async handle(request: RequestInstance) {
|
|
16
|
+
const email = request.get('email')
|
|
17
|
+
|
|
18
|
+
if (!email) {
|
|
19
|
+
return Response.json({ error: 'Email is required' }, { status: 422 })
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const user = await User.where('email', email).first()
|
|
23
|
+
|
|
24
|
+
if (!user) {
|
|
25
|
+
return Response.json({ error: 'User not found' }, { status: 404 })
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const userPasskeys = await getUserPasskeys(user.id as number)
|
|
29
|
+
|
|
30
|
+
// Use configured app URL for rpID instead of hardcoded localhost
|
|
31
|
+
const appUrl = config.app?.url || 'localhost'
|
|
32
|
+
const rpID = new URL(appUrl.startsWith('http') ? appUrl : `https://${appUrl}`).hostname
|
|
33
|
+
|
|
34
|
+
const options: PublicKeyCredentialRequestOptionsJSON = await generateAuthenticationOptions({
|
|
35
|
+
rpID,
|
|
36
|
+
allowCredentials: userPasskeys.map(passkey => ({
|
|
37
|
+
id: passkey.id,
|
|
38
|
+
transports: ['internal'],
|
|
39
|
+
})),
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
// Persist the challenge server-side so `VerifyAuthenticationAction`
|
|
43
|
+
// can consume it from the DB instead of trusting `body.challenge`.
|
|
44
|
+
// The previous round-trip-through-the-client pattern let an
|
|
45
|
+
// attacker who captured an assertion replay it as long as they
|
|
46
|
+
// also captured the challenge. See stacksjs/stacks#1866.
|
|
47
|
+
await storeWebAuthnChallenge(user.id as number, options.challenge, 'authentication')
|
|
48
|
+
|
|
49
|
+
return options
|
|
50
|
+
},
|
|
51
|
+
})
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { generateRegistrationOptions, getUserPasskeys, storeWebAuthnChallenge } from '@stacksjs/auth'
|
|
3
|
+
import { config } from '@stacksjs/config'
|
|
4
|
+
|
|
5
|
+
export default new Action({
|
|
6
|
+
name: 'PasskeyRegistrationAction',
|
|
7
|
+
description: 'Generate Passkey Registration Options',
|
|
8
|
+
method: 'POST',
|
|
9
|
+
async handle(request: RequestInstance) {
|
|
10
|
+
// Enrolling a passkey attaches a new login credential to an
|
|
11
|
+
// account — the identity MUST come from the caller's own
|
|
12
|
+
// authenticated session, never a client-supplied `email` field.
|
|
13
|
+
// Trusting `request.get('email')` here let anyone who knew a
|
|
14
|
+
// victim's email register a passkey against that victim's
|
|
15
|
+
// account and log in as them, no password required. This route
|
|
16
|
+
// must stay behind `middleware('auth')` — see routes/dashboard.ts.
|
|
17
|
+
const user = await request.user()
|
|
18
|
+
|
|
19
|
+
if (!user)
|
|
20
|
+
return Response.json({ error: 'Unauthorized' }, { status: 401 })
|
|
21
|
+
|
|
22
|
+
const userPasskeys = await getUserPasskeys(user.id as number)
|
|
23
|
+
const userEmail = user.email ?? ''
|
|
24
|
+
|
|
25
|
+
// Use configured app URL for rpID instead of hardcoded localhost
|
|
26
|
+
const appUrl = config.app?.url || 'localhost'
|
|
27
|
+
const rpID = new URL(appUrl.startsWith('http') ? appUrl : `https://${appUrl}`).hostname
|
|
28
|
+
const rpName = config.app?.name || 'Stacks'
|
|
29
|
+
|
|
30
|
+
const options = await generateRegistrationOptions({
|
|
31
|
+
rpName,
|
|
32
|
+
rpID,
|
|
33
|
+
userName: userEmail,
|
|
34
|
+
attestationType: 'none',
|
|
35
|
+
excludeCredentials: userPasskeys.map(passkey => ({
|
|
36
|
+
id: passkey.id,
|
|
37
|
+
transports: ['internal'],
|
|
38
|
+
})),
|
|
39
|
+
authenticatorSelection: {
|
|
40
|
+
residentKey: 'preferred',
|
|
41
|
+
userVerification: 'preferred',
|
|
42
|
+
authenticatorAttachment: 'platform',
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Persist the challenge server-side so VerifyRegistrationAction
|
|
47
|
+
// can consume it instead of trusting `body.challenge`. See
|
|
48
|
+
// stacksjs/stacks#1866.
|
|
49
|
+
await storeWebAuthnChallenge(user.id as number, options.challenge, 'registration')
|
|
50
|
+
|
|
51
|
+
return options
|
|
52
|
+
},
|
|
53
|
+
})
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { generateTwoFactorSetup, stashPendingTwoFactorSecret } from '@stacksjs/auth'
|
|
3
|
+
import { config } from '@stacksjs/config'
|
|
4
|
+
import { response } from '@stacksjs/router'
|
|
5
|
+
|
|
6
|
+
export default new Action({
|
|
7
|
+
name: 'GenerateTwoFactorSecretAction',
|
|
8
|
+
description: 'Generate a new TOTP secret + otpauth URI for the authenticated user to scan',
|
|
9
|
+
method: 'POST',
|
|
10
|
+
async handle(request: RequestInstance) {
|
|
11
|
+
const user = await request.user()
|
|
12
|
+
if (!user)
|
|
13
|
+
return response.unauthorized('Unauthorized')
|
|
14
|
+
|
|
15
|
+
const appName = config.app?.name || 'Stacks'
|
|
16
|
+
const { secret, uri } = generateTwoFactorSetup(user.email ?? '', appName)
|
|
17
|
+
|
|
18
|
+
// Not persisted to users.two_factor_secret until EnableTwoFactorAction
|
|
19
|
+
// verifies a code produced from it — but stashed server-side now so
|
|
20
|
+
// that step never has to trust a client-supplied secret. See
|
|
21
|
+
// two-factor.ts's doc comment for why.
|
|
22
|
+
await stashPendingTwoFactorSecret(user.id as number, secret)
|
|
23
|
+
|
|
24
|
+
return response.json({ secret, uri })
|
|
25
|
+
},
|
|
26
|
+
})
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { tokens } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
export default new Action({
|
|
6
|
+
name: 'ListTokensAction',
|
|
7
|
+
description: 'List all access tokens for the authenticated user',
|
|
8
|
+
method: 'GET',
|
|
9
|
+
async handle(request: RequestInstance) {
|
|
10
|
+
const user = await request.user()
|
|
11
|
+
|
|
12
|
+
if (!user) {
|
|
13
|
+
return response.unauthorized('Authentication required')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const userTokens = await tokens(user.id)
|
|
17
|
+
|
|
18
|
+
return response.json({
|
|
19
|
+
tokens: userTokens.map(token => ({
|
|
20
|
+
id: token.id,
|
|
21
|
+
name: token.name,
|
|
22
|
+
scopes: token.scopes,
|
|
23
|
+
expires_at: token.expiresAt?.toISOString() || null,
|
|
24
|
+
created_at: token.createdAt.toISOString(),
|
|
25
|
+
last_used_at: token.updatedAt.toISOString(),
|
|
26
|
+
})),
|
|
27
|
+
count: userTokens.length,
|
|
28
|
+
})
|
|
29
|
+
},
|
|
30
|
+
})
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createTwoFactorChallenge, getTwoFactorState } from '@stacksjs/auth'
|
|
2
|
+
import { User } from '@stacksjs/orm'
|
|
3
|
+
|
|
4
|
+
export default new Action({
|
|
5
|
+
name: 'LoginAction',
|
|
6
|
+
description: 'Login to the application',
|
|
7
|
+
method: 'POST',
|
|
8
|
+
|
|
9
|
+
validations: {
|
|
10
|
+
email: {
|
|
11
|
+
rule: schema.string().email(),
|
|
12
|
+
message: 'Email must be a valid email address.',
|
|
13
|
+
},
|
|
14
|
+
password: {
|
|
15
|
+
rule: schema.string().min(6).max(255),
|
|
16
|
+
message: 'Password must be between 6 and 255 characters.',
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
async handle(request: RequestInstance) {
|
|
21
|
+
const email = request.get('email')
|
|
22
|
+
const password = request.get('password')
|
|
23
|
+
|
|
24
|
+
// Verify credentials WITHOUT minting tokens yet — if the account
|
|
25
|
+
// has TOTP 2FA enabled, no token pack should exist until the code
|
|
26
|
+
// is also verified (VerifyTwoFactorLoginAction mints the real
|
|
27
|
+
// pack via Auth.loginUsingId, same as the non-2FA path below).
|
|
28
|
+
const isValid = await Auth.attempt({ email, password })
|
|
29
|
+
if (!isValid)
|
|
30
|
+
return response.unauthorized('Incorrect email or password')
|
|
31
|
+
|
|
32
|
+
const authedUser = await User.where('email', '=', email).first()
|
|
33
|
+
if (!authedUser)
|
|
34
|
+
return response.unauthorized('Incorrect email or password')
|
|
35
|
+
|
|
36
|
+
const { enabled: twoFactorEnabled } = await getTwoFactorState(authedUser.id as number)
|
|
37
|
+
if (twoFactorEnabled) {
|
|
38
|
+
const challengeToken = await createTwoFactorChallenge(authedUser.id as number)
|
|
39
|
+
return response.json({
|
|
40
|
+
requires_two_factor: true,
|
|
41
|
+
challenge_token: challengeToken,
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const result = await Auth.loginUsingId(authedUser.id as number)
|
|
46
|
+
if (!result)
|
|
47
|
+
return response.unauthorized('Incorrect email or password')
|
|
48
|
+
|
|
49
|
+
const user = result.user
|
|
50
|
+
|
|
51
|
+
// OAuth2-compatible payload. Clients should:
|
|
52
|
+
// - Send `Authorization: Bearer <access_token>` for API calls.
|
|
53
|
+
// - Cache the access token for at most `expires_in` seconds.
|
|
54
|
+
// - Exchange `refresh_token` at /auth/refresh when the access
|
|
55
|
+
// token nears expiry. The refresh token is single-use; the
|
|
56
|
+
// refresh response returns a new pair (rotation).
|
|
57
|
+
// The legacy `token` field is kept for backward compatibility
|
|
58
|
+
// with clients that haven't been updated yet — it shadows
|
|
59
|
+
// `access_token` and will be removed in a future major.
|
|
60
|
+
return response.json({
|
|
61
|
+
access_token: result.token,
|
|
62
|
+
refresh_token: result.refreshToken,
|
|
63
|
+
token_type: 'Bearer',
|
|
64
|
+
expires_in: result.expiresIn,
|
|
65
|
+
token: result.token,
|
|
66
|
+
user: {
|
|
67
|
+
id: user?.id,
|
|
68
|
+
email: user?.email,
|
|
69
|
+
name: user?.name,
|
|
70
|
+
},
|
|
71
|
+
})
|
|
72
|
+
},
|
|
73
|
+
})
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { Auth } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
export default new Action({
|
|
6
|
+
name: 'LogoutAction',
|
|
7
|
+
description: 'Logout from the application',
|
|
8
|
+
method: 'POST',
|
|
9
|
+
async handle() {
|
|
10
|
+
await Auth.logout()
|
|
11
|
+
|
|
12
|
+
return response.json({
|
|
13
|
+
message: 'Successfully logged out',
|
|
14
|
+
})
|
|
15
|
+
},
|
|
16
|
+
})
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { revokeAllTokens, sessionDestroyAll } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
|
|
5
|
+
export default new Action({
|
|
6
|
+
name: 'LogoutAllAction',
|
|
7
|
+
description: 'Logout from all devices',
|
|
8
|
+
method: 'POST',
|
|
9
|
+
async handle(request: RequestInstance) {
|
|
10
|
+
const user = await request.user()
|
|
11
|
+
|
|
12
|
+
if (!user?.id) {
|
|
13
|
+
return response.unauthorized('Authentication required')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Revoke every access + refresh token, then destroy every session
|
|
17
|
+
// row for the user. Awaited un-caught (fail-loud) so a partial sweep
|
|
18
|
+
// surfaces as a 500 instead of a "logged out everywhere" that left a
|
|
19
|
+
// credential alive — same rationale as the password-reset sweep
|
|
20
|
+
// (stacksjs/stacks#1957, #1947).
|
|
21
|
+
await revokeAllTokens(Number(user.id))
|
|
22
|
+
await sessionDestroyAll(Number(user.id))
|
|
23
|
+
|
|
24
|
+
return response.json({
|
|
25
|
+
message: 'Successfully logged out from all devices',
|
|
26
|
+
})
|
|
27
|
+
},
|
|
28
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Action } from '@stacksjs/actions'
|
|
2
|
+
import { refreshToken } from '@stacksjs/auth'
|
|
3
|
+
import { response } from '@stacksjs/router'
|
|
4
|
+
import { schema } from '@stacksjs/validation'
|
|
5
|
+
|
|
6
|
+
export default new Action({
|
|
7
|
+
name: 'RefreshTokenAction',
|
|
8
|
+
description: 'Exchange a refresh token for a new access token',
|
|
9
|
+
method: 'POST',
|
|
10
|
+
async handle(request: RequestInstance) {
|
|
11
|
+
const refreshTokenValue = request.get('refresh_token')
|
|
12
|
+
|
|
13
|
+
await request.validate({
|
|
14
|
+
refresh_token: {
|
|
15
|
+
rule: schema.string().min(1),
|
|
16
|
+
message: {
|
|
17
|
+
min: 'Refresh token is required',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
try {
|
|
23
|
+
const result = await refreshToken(refreshTokenValue, {
|
|
24
|
+
expiresInMinutes: 60, // 1 hour access token
|
|
25
|
+
refreshExpiresInDays: 30, // 30 day refresh token
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
return response.json({
|
|
29
|
+
access_token: result.plainTextToken,
|
|
30
|
+
refresh_token: result.refreshToken,
|
|
31
|
+
token_type: 'Bearer',
|
|
32
|
+
expires_in: result.expiresIn,
|
|
33
|
+
})
|
|
34
|
+
}
|
|
35
|
+
catch (error: any) {
|
|
36
|
+
return response.unauthorized(error.message || 'Invalid or expired refresh token')
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
})
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// No imports needed - everything is auto-imported!
|
|
2
|
+
|
|
3
|
+
export default new Action({
|
|
4
|
+
name: 'RegisterAction',
|
|
5
|
+
description: 'Register a new user',
|
|
6
|
+
method: 'POST',
|
|
7
|
+
|
|
8
|
+
validations: {
|
|
9
|
+
email: {
|
|
10
|
+
rule: schema.string().email(),
|
|
11
|
+
message: 'Email must be a valid email address.',
|
|
12
|
+
},
|
|
13
|
+
password: {
|
|
14
|
+
rule: schema.string().min(6).max(255),
|
|
15
|
+
message: 'Password must be between 6 and 255 characters.',
|
|
16
|
+
},
|
|
17
|
+
name: {
|
|
18
|
+
rule: schema.string().min(2).max(255),
|
|
19
|
+
message: 'Name must be between 2 and 255 characters.',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
async handle(request: RequestInstance) {
|
|
24
|
+
const email = request.get('email')
|
|
25
|
+
const password = request.get('password')
|
|
26
|
+
const name = request.get('name')
|
|
27
|
+
|
|
28
|
+
const result = await register({ email, password, name })
|
|
29
|
+
|
|
30
|
+
if (result) {
|
|
31
|
+
const user = await Auth.getUserFromToken(result.token)
|
|
32
|
+
|
|
33
|
+
// Fire `user:registered` so app/Events.ts listeners (welcome email,
|
|
34
|
+
// CRM sync, internal slack ping, etc.) actually run. Fire-and-forget
|
|
35
|
+
// — listener errors are caught by the wildcard handler so a flaky
|
|
36
|
+
// welcome email doesn't fail registration. The `to` alias matches
|
|
37
|
+
// the contract SendWelcomeEmail expects.
|
|
38
|
+
dispatch('user:registered', {
|
|
39
|
+
id: user?.id,
|
|
40
|
+
email: user?.email,
|
|
41
|
+
name: user?.name,
|
|
42
|
+
to: user?.email,
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
return response.json({
|
|
46
|
+
token: result.token,
|
|
47
|
+
user: {
|
|
48
|
+
id: user?.id,
|
|
49
|
+
email: user?.email,
|
|
50
|
+
name: user?.name,
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return response.error('Registration failed')
|
|
56
|
+
},
|
|
57
|
+
})
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// No imports needed - everything is auto-imported!
|
|
2
|
+
|
|
3
|
+
export default new Action({
|
|
4
|
+
name: 'ResendVerificationAction',
|
|
5
|
+
description: 'Resend email verification link',
|
|
6
|
+
method: 'POST',
|
|
7
|
+
|
|
8
|
+
async handle(request: RequestInstance) {
|
|
9
|
+
const user = await request.user()
|
|
10
|
+
|
|
11
|
+
if (!user) {
|
|
12
|
+
return response.unauthorized('Unauthenticated.')
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const { resendVerificationEmail } = await import('@stacksjs/auth')
|
|
16
|
+
const result = await resendVerificationEmail(user)
|
|
17
|
+
|
|
18
|
+
if (!result.success) {
|
|
19
|
+
return response.json({ success: false, message: result.message }, 422)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return response.json({ success: true, message: result.message })
|
|
23
|
+
},
|
|
24
|
+
})
|