Kristaps Fabians Geikins
5ff030224b
fix(server): fallback to viewer if no seat found ( #4748 )
2025-05-15 12:04:56 +03:00
Gergő Jedlicska
380e55b7aa
fix(server): we should default to a viewer seat in the rare cases of no seat assigned to the user ( #4735 )
2025-05-14 10:04:09 +03:00
Kristaps Fabians Geikins
211922b6a6
chore: get rid of all old workspace plan code ( #4624 )
...
* first batch of changes
* tests fix
* FE fixed
* renaming constants
* test fixes
* moar test fixes
* another test fix
* reenable app rover check
---------
Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com >
2025-04-30 19:18:32 +02:00
Kristaps Fabians Geikins
89391d92ab
feat(server): get workspace seat usage w/o a subscription ( #4574 )
...
* feat(server): get workspace seat usage w/o a subscription
* minor cleanup
2025-04-23 15:26:02 +03:00
Gergő Jedlicska
ef08f8cecf
fix(gatekeeper): only return available seats if there are some ( #4463 )
2025-04-16 18:30:18 +01:00
Gergő Jedlicska
61ca128ce2
gergo/multiCurrency ( #4379 )
...
* feat(gatekeeper): support multiple currencies
* feat(helm): add new currency based prices to helm chart
* chore(env): add example currency based pricing values
* fix(ci): update price ids to the proper values
* feat(helm): rename price ids to fit multi currency
* feat(gatekeeper): currency input for checkout session
* Updated prices in the FE
* chore(gatekeeper): remove old checkout session flow
* Updated prices in the FE
* Fix FE
* Fix pipeline
---------
Co-authored-by: Mike Tasset <mike.tasset@gmail.com >
2025-04-11 17:37:47 +02:00
Iain Sproat
9308fa82b4
chore(server/observability): logging of gatekeeper/rest/billing ( #4066 )
...
* chore(server/observability): logging of gatekeeper/rest/billing
* Rename logged field
* use logWithErr, operationStatus, and operationName
- clean up logging
* Fix bad merge from main
* Use a wrapper to log
* Include mutation resolvers
* Fix per PR comments
2025-04-11 15:27:52 +02:00
Gergő Jedlicska
5fce827ad7
feat(gatekeeper): calculate available seats from purchased and used ( #4362 )
2025-04-09 19:51:02 +02:00
Chuck Driesler
cb7243cfbe
feat(authz): Project.canCreateModel and Project.canMoveToWorkspace policies ( #4342 )
...
* feat(authz): Project.canCreateModel policy
* feat(authz): Project.canMoveToWorkspace policy
* fix(authz): expose policies as permissions objects
* chore(authz): actually use the policies lol
* chore(authz): add tests for new policies
* fix(authz): skip affected test
* fix(authz): pr comments
* fix(authz): better errors, better tests
* chore(authz): remove references to deleted error
2025-04-08 15:29:12 +01:00
Alessandro Magionami
d640f23c7d
Merge branch 'main' of github.com:specklesystems/speckle-server into alessandro/web-2944-versions-hide-referencedobject
2025-04-07 16:12:41 +02:00
Gergő Jedlicska
a3644a50c5
gergo/web 2931 introduce missing workspace plans ( #4323 )
...
* fix(gatekeeper): missing priceId-s should stop the server from booting
* feat(shared): add all new workspace plans
* feat(billing): add new world plans
* feat(ci): use stripe sandbox id-s from test env vars
* chore(ci): remove defunct stripe context
* chore(server-env): fix server env example
* feat(gatekeeper): add missing plans to graphql schema
* test(gatekeeper): update plan upgrade tests to match implementation
* fix(ci): update ci .env source
* fix(ci): we do need some secrets from stripe
* fix(ci): run gql schema introspect with the test env
* fix(frontend): format new plan names
* chore(ci): temp disable gql schema checks
* feat(helm): add unlimited seat prices env vars
* feat(helm): add unlimited seat prices to values
* feat(gatekeeper): do not load priceId-s as a side effect, load with module init
2025-04-07 15:24:57 +02:00
Alessandro Magionami
a02ea60bc7
Merge branch 'main' of github.com:specklesystems/speckle-server into alessandro/web-2944-versions-hide-referencedobject
2025-04-07 09:37:04 +02:00
Chuck Driesler
cb7dead0b6
fix(workspaces): require models to have versions to count towards billing limits ( #4325 )
2025-04-04 13:42:30 +01:00
Chuck Driesler
855185245e
feat(workspaces): consolidate workspace role/seat reporting ( #4315 )
...
* feat(workspaces: shuffle seat type counts around
* fix(workspaces): use new counts
* fix(workspaces): better field placement
* Updated FE
* chore(workspaces): fix tests
* fix(workspaces): use correct flags
* fix(workspaces): correct another test
* fix(workspaces): use correct model count function
---------
Co-authored-by: Mike Tasset <mike.tasset@gmail.com >
2025-04-04 10:27:49 +01:00
Alessandro Magionami
5c004f85b1
chore(gatekeeper): get workspace plan repository and dataloader function
2025-04-04 10:51:46 +02:00
Chuck Driesler
6cea72e4f8
feat(workspaces): add query for fetching usage ( #4306 )
...
* WIP can create project
* WIP can create project more work
* complete body, stencil tests
* feat(shared): move workspace plan types into shared
* test progress wip
* feat(shared): add more logic to canCreateWorkspaceProject
* a few more tests, as a treat
* chore(authz): round out tests
* fixed loaders, new GQL checks, dataLoaders in auth loaders
* fix(authz): get workspace limits loader
* chore(authz): update loaders
* frontend fixed up to snuff
* fix(authz): fix workspace plans for tests
* fix(authz): classic
* feat(workspaces): emit plan usage from BE
* fix(authz): 0 counts
* fix(workspaces): fix counts for 0
* chore(workspaces): gqlgen
* fix(workspaces): update fragment to use new fields
* fix(workspaces): count regional projects correctly
---------
Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com >
Co-authored-by: Kristaps Fabians Geikins <fabis94@live.com >
2025-04-03 09:06:34 +01:00
Alessandro Magionami
57c6763953
chore(workspaces): fix imports
2025-03-31 17:39:15 +02:00
Alessandro Magionami
99d9c9a2ad
feat(workspaces): seats by type counts in workspace
2025-03-31 16:43:00 +02:00
Kristaps Fabians Geikins
a83bae8d84
feat: Workspace/ProjectCollaborator/WorkspaceCollaborator seatType ( #4284 )
...
* Workspace & ProjectCollaborator seat type
* minor adjustment to FE
* minor adjustment to FE
2025-03-31 13:07:35 +03:00
Alessandro Magionami
a38bbd4066
feat(workspaces): add viewers count
2025-03-26 10:24:14 +01:00
Alessandro Magionami
ddae24eedf
chore(workspaces): add test and make product selection more robust
2025-03-25 17:40:09 +01:00
Alessandro Magionami
eaf3b3a479
feat(gatekeeper): seats counts
2025-03-25 09:47:13 +01:00
Kristaps Fabians Geikins
b55e197d00
chore(server): refactor seat updated to be its own event ( #4214 )
...
* chore(server): refactor seat updated to be its own event
* minor cleanup
* test fix
2025-03-19 12:17:27 +02:00
Kristaps Fabians Geikins
d903e8ffc4
feat(server): support editor -> viewer seat downgrades ( #4181 )
...
* new seat based project role checks implemented
* everything done
* minor bugfix
2025-03-14 14:21:25 +02:00
Alessandro Magionami
89519bc6b7
Merge branch 'main' of github.com:specklesystems/speckle-server into alessandro/web-2741-subscriptions-to-upgrade-for-new-plan-types
2025-03-12 10:01:02 +01:00
Alessandro Magionami
d20d3bf94a
feat(gatekeeper): implement new upgrade plan in resolver
2025-03-11 17:54:54 +01:00
Kristaps Fabians Geikins
28b49107b7
feat(server): upgrade workspace seat type ( #4158 )
...
* feat(server): upgrade workspace seat type
* test/lint fixes
2025-03-11 12:41:18 +02:00
Alessandro Magionami
656614e9bc
chore(gatekeeper): fix build
2025-03-06 10:28:27 +01:00
Alessandro Magionami
66ddb1eb34
Merge branch 'main' of github.com:specklesystems/speckle-server into alessandro/web-2774-upgrade-from-free-to-paid-plan
2025-03-05 19:29:44 +01:00
Alessandro Magionami
bcdb5ed0b0
feat(gatekeeper): new checkout flow
2025-03-05 17:35:28 +01:00
Kristaps Fabians Geikins
954b1a9f11
feat: plan prices accurately read from Stripe ( #4104 )
...
* WIP prices + new caching utils
* cached workspace plan prices
* GQL API done
* integrated in frontend
* fixed missing FF
* CR fixes
* integration tests
* removed non-existant team yearly env var
2025-03-05 12:23:38 +02:00
Iain Sproat
6f0133a39b
chore(server/observability): logging of resolver to create checkout session ( #4067 )
2025-02-28 15:42:12 +00:00
Kristaps Fabians Geikins
ec092fb042
chore: move common workspace plan/feature config to @speckle/shared ( #4064 )
...
fix: gqlgen regenerated
2025-02-27 11:18:30 +02:00
Kristaps Fabians Geikins
eb050bb649
feat(server): new plans + disabled checkout/upgrade/sidegrade ( #4057 )
...
* feat(server): new plans + disabled checkout/upgrade/sidegrade
* pushed in CR fixes
2025-02-25 09:46:46 +01:00
Gergő Jedlicska
5b0bb3b65d
gergo/web 2635 set up new plans in the backend ( #4031 )
...
* feat(gatekeeper): add new free plan option as an unpaid workspace plan
* feat(workspaces): add feature flag for new plans
* feat(gatekeeper): add free plan option to workspace plans
* Added button in FE
* Make button more beautifuller
* feat(gatekeeper): enable creating workspaces on a free plan
* Fix
* Fix FE linting
---------
Co-authored-by: Mike Tasset <mike.tasset@gmail.com >
2025-02-21 14:49:04 +01:00
Chuck Driesler
a8969c9b33
fix(billing): can't be read only if no billing ( #3949 )
2025-02-11 17:08:09 +01:00
Iain Sproat
c59e6043bb
fix(server/errors): derive errors from BaseError ( #3918 )
2025-01-30 18:15:56 +01:00
Gergő Jedlicska
7b295ba408
gergo/web 2428 academia should be free business ( #3842 )
...
* feat(server): workspace shoul equal unpaid business
* feat(server): add free workspace plans
* feat(gatekeeper): rename plans to invoiced
* chore(gatekeeper): regen gql
* feat(gatekeeper): calculate workspace plan payment method
* fix(fe2): add missing workspace plans
2025-01-16 18:14:33 +01:00
Alessandro Magionami
a363f0e81a
feat(workspaces): expose graphql field readonly for workspace type ( #3659 )
...
* feat(workspaces): add readOnly field to workspace gql type
* feat(workspaces): add readOnly logic for workspace
* refactor(gatekeeper): use exhaustive switch pattern
* chore(billing): fix test
* feat(gatekeeper): fix tests
---------
Co-authored-by: Gergő Jedlicska <gergo@jedlicska.com >
2024-12-18 13:47:27 +00:00
Gergő Jedlicska
68938bab94
feat(gatekeeper): show subscription seats ( #3679 )
...
* feat(gatekeeper): show subscription seats
* Enabled summary on billing page
* Made interval dynamic
---------
Co-authored-by: Mike Tasset <mike.tasset@gmail.com >
2024-12-11 22:19:22 +01:00
Mike
8f4593e606
Feat: Workspace creation wizard ( #3625 )
2024-12-04 14:19:52 +01:00
Mike
b2cebea7eb
Fix: Various billing fixes ( #3569 )
2024-11-28 20:24:05 +01:00
Gergő Jedlicska
ec02e63707
feat(gatekeeper): upgrade workspace plan ( #3572 )
2024-11-28 11:15:32 +01:00
Kristaps Fabians Geikins
a90bc3a1ed
fix(fe2): workspace region settings broken if non-admin + Workspace.subscription errors ( #3567 )
...
* regions fix
* skip logging subscription error
* added default region set mp track
* removed no longer necessary test
2024-11-27 16:42:58 +02:00
Gergő Jedlicska
80cf6b3904
fix(gatekeeper): fix the checkout session cancellation logic ( #3553 )
...
* fix(gatekeeper): fix the checkout session cancellation logic
* Updated FE
* Remove debug
* Add error toast
---------
Co-authored-by: Mike Tasset <mike.tasset@gmail.com >
2024-11-26 16:30:55 +01:00
Gergő Jedlicska
381c4e2a85
feat(gatekeeper): feature access resolver ( #3514 )
2024-11-19 15:44:43 +01:00
Gergő Jedlicska
af3857a209
gergo/web 2038 billing graphql api ( #3379 )
...
* feat(gatekeeper): add gatekeeper module feature flag
* feat(gatekeeper): add workspace pricing table domain
* feat(gatekeeper): add checkout session creation
* feat(gatekeeper): verify stripe signature
* wip(gatekeeper): checkout callbacks
* feat(gatekeeper): add unlimited and academia plan types
* refactor(envHelper): getStringFromEnv helper
* chore(gatekeeper): add future todos
* feat(gatekeeper): add productId to the subscription domain
* feat(gatekeeper): add in memory repositories
* feat(gatekeeper): add more errors
* feat(gatekeeper): complete checkout session service
* feat(gatekeeper): add stripe client implementation
* feat(gatekeeper): add checkout session completion webhook callback path
* feat(gendo): fix not needing env vars if gendo module is not enabled
* feat(gatekeeper): require a license for billing
* chore(gatekeeper): cleanup before testing
* feat(gatekeeper): subscriptionData parsing model
* ci: add billing integration and gatekeeper modules to test config
* test(gatekeeper): add checkout service tests
* feat(gatekeeper): make completeCheckout callback idempotent properly
* feat(gatekeeper): move to knex based repositories
* test(gatekeeper): billing repository tests
* feat(gatekeeper): add yearly billing cycle toggle
* feat(ci): add stripe integration context to test job
* feat(billingPage): conditionally render the checkout CTAs
* fix(gatekeeper): remove flaky test condition
* feat(helm): add billing integration feature flag
* WIP billing gql api
* feat(gatekeeper): cancel checkout session api
* feat(gatekeeper): handle existing checkout sessions, when trying to create a new one
* feat(gatekeeper): add workspace plans gql api
* feat(gatekeeper): handle cancelation and subscription updates
* fix(gatekeeper): scope initialization
* fix(gatekeeper): eliminate stripe client import sideeffect
* fix(gatekeeper): eliminate stripe client import sideeffect 2
* fix(mainConstants): fitler gatekeeper scopes with feature flag
2024-10-25 10:46:09 +02:00
Gergő Jedlicska
8cba7eb6f7
gergo/web 1968 add features list ( #3332 )
...
* feat(gatekeeper): add gatekeeper module feature flag
* feat(gatekeeper): add workspace pricing table domain
* feat(gatekeeper): add checkout session creation
* feat(gatekeeper): verify stripe signature
* wip(gatekeeper): checkout callbacks
* feat(gatekeeper): add unlimited and academia plan types
* refactor(envHelper): getStringFromEnv helper
* chore(gatekeeper): add future todos
* feat(gatekeeper): add productId to the subscription domain
* feat(gatekeeper): add in memory repositories
* feat(gatekeeper): add more errors
* feat(gatekeeper): complete checkout session service
* feat(gatekeeper): add stripe client implementation
* feat(gatekeeper): add checkout session completion webhook callback path
* feat(gendo): fix not needing env vars if gendo module is not enabled
* feat(gatekeeper): require a license for billing
* chore(gatekeeper): cleanup before testing
* feat(gatekeeper): subscriptionData parsing model
* ci: add billing integration and gatekeeper modules to test config
* test(gatekeeper): add checkout service tests
* feat(gatekeeper): make completeCheckout callback idempotent properly
* feat(gatekeeper): move to knex based repositories
* test(gatekeeper): billing repository tests
* feat(gatekeeper): add yearly billing cycle toggle
* feat(ci): add stripe integration context to test job
* feat(billingPage): conditionally render the checkout CTAs
* fix(gatekeeper): remove flaky test condition
* feat(helm): add billing integration feature flag
2024-10-20 15:40:31 +02:00