Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
49f35f8
Initial draft of db migration
thomasgwatson Oct 21, 2025
8d67ead
Deeper tweaks to migration
thomasgwatson Oct 22, 2025
25b8d53
Paid content backend, without actual access control
thomasgwatson Oct 23, 2025
57aa2bb
Ensure we pass group id as metadata on stripe connect account creation
thomasgwatson Oct 23, 2025
8e35035
Refined backend
thomasgwatson Oct 26, 2025
002a2c8
Get tests *runnnig* but not yet passing
thomasgwatson Oct 26, 2025
f83c0d3
wip web changes
thomasgwatson Oct 26, 2025
43b2993
Merge branch 'fix-backend-tests-v3' into 604-paid-content
thomasgwatson Oct 28, 2025
dc65148
Merge branch 'fix-backend-tests-v3' into 604-paid-content
thomasgwatson Oct 28, 2025
d08ad7f
Stripe mutations tests all passing
thomasgwatson Oct 28, 2025
f925889
Content access mutation tests passing
thomasgwatson Oct 28, 2025
da4d0ed
Switch connect access to track granting group and permissioned group …
thomasgwatson Oct 29, 2025
de7a335
Sync schema with queries
thomasgwatson Oct 29, 2025
6ad40bc
Merge branch 'fix-backend-tests-v3' into 604-paid-content
thomasgwatson Oct 29, 2025
16a7e15
Allow group admins to create stripe account; add check for stripe sta…
thomasgwatson Oct 30, 2025
2741504
Merge branch 'dev' into 604-paid-content
thomasgwatson Nov 4, 2025
b8d685c
Switch from product to offering for paid content descriptor
thomasgwatson Nov 5, 2025
b37bef4
Use correct host for links
thomasgwatson Nov 5, 2025
9968bb8
Merge conflict syntax errors missed in the conflict resolution
thomasgwatson Nov 5, 2025
983b839
Expand paid content sub-tabs in the group settings
thomasgwatson Nov 5, 2025
7b3de54
Clean up stripe account connection
thomasgwatson Nov 6, 2025
919ed81
Allow offers to be created; display existing offerings; start of vali…
thomasgwatson Nov 6, 2025
e4dadfb
Merge branch 'dev' into 604-paid-content
tibetsprague Nov 6, 2025
cfe7eed
Merge branch 'dev' into 604-paid-content
tibetsprague Nov 8, 2025
e2fc741
Allow filtering of offerings by type
thomasgwatson Nov 10, 2025
d5c2742
Merge branch 'dev' into 604-paid-content
thomasgwatson Nov 10, 2025
beb7559
Merge branch '604-paid-content' of https://github.com/Hylozoic/hylo i…
thomasgwatson Nov 10, 2025
a1c7eb7
Extend content_access concept to include user_scopes table as the way…
thomasgwatson Nov 10, 2025
3ea840c
Ensure frontend can lookup accessGrants on Stripe offerings
thomasgwatson Nov 11, 2025
243077c
Add initial paywall UI and backend changes
thomasgwatson Nov 12, 2025
239aaa1
Handle stripe checkout success anf failure
thomasgwatson Nov 12, 2025
dcce9fa
Accommodate someone with a group membership but no scope access (via …
thomasgwatson Nov 12, 2025
fb5580e
update webhook handlers to create membership and access grant for use…
thomasgwatson Nov 12, 2025
d907681
Add access control related fields to track queries
thomasgwatson Nov 12, 2025
dcbcecc
Allow tracks to be acess controlled as well
thomasgwatson Nov 14, 2025
e122543
Add /offerings/:offeringId to public router
thomasgwatson Nov 15, 2025
cab458f
Add /offerings/:offeringId to public router
thomasgwatson Nov 15, 2025
3affa04
Switch to using stripe session id, instead of stripe payment intent id
thomasgwatson Nov 17, 2025
51f277e
Handle scubscription created webhook events
thomasgwatson Nov 17, 2025
18f09e4
Better handle subscription webhook lifecycle
thomasgwatson Nov 17, 2025
4466ee7
Update test doc for webhooks
thomasgwatson Nov 17, 2025
7bae936
Fix backend tests
thomasgwatson Nov 20, 2025
97abcc2
Confirm stripe events fire for single purchase
thomasgwatson Nov 20, 2025
243e2ce
Basic content access page for admins
thomasgwatson Nov 21, 2025
d65dc18
Pin groups to nav menu if they are paid for
thomasgwatson Nov 21, 2025
ecbcc46
Merge branch 'dev' into 604-paid-content
thomasgwatson Dec 9, 2025
7414a5f
Merge branch '604-paid-content' of https://github.com/Hylozoic/hylo i…
thomasgwatson Dec 9, 2025
f736fd7
Redirect joinGroup hook to about page; allow access to /about page wh…
thomasgwatson Dec 14, 2025
8b4b1cb
Streamline joinSection and paywall section to share joinBarriers comp…
thomasgwatson Dec 15, 2025
3211a93
Validate if currentUsers email matches the invite-links email; i18n
thomasgwatson Dec 15, 2025
d5565ab
Update platform fee
thomasgwatson Dec 15, 2025
e1f6a0c
Actually create subscription type offerings
thomasgwatson Dec 15, 2025
c0b48fa
Ensure users with memberships but no user-scope are defined as lapsed…
thomasgwatson Dec 15, 2025
73ccc99
Split stripe/content access graphql operations into queries and mutat…
thomasgwatson Dec 16, 2025
0ec9ce1
Update tests
thomasgwatson Dec 16, 2025
eff5e8d
Pull accounting related stats from Stripe for a groups offerings
thomasgwatson Dec 16, 2025
f10b6bf
Show basic accounting information for each offering; clear up some pr…
thomasgwatson Dec 16, 2025
e0003a7
Also provide some stats for one-time purchase items
thomasgwatson Dec 16, 2025
941af85
Update detailed manual test cases
thomasgwatson Dec 16, 2025
286c695
Fix faulty useEffects requesting too much; split paidContentTab into …
thomasgwatson Dec 17, 2025
271af68
Merge branch 'dev' into 604-paid-content
thomasgwatson Dec 28, 2025
3c4229e
Enable access control for tracks
thomasgwatson Dec 29, 2025
daa7d35
Allow admins to grant access to paywall group or access controlled tr…
thomasgwatson Jan 1, 2026
d22466f
Allow admins to invite users to their group AND add a role
thomasgwatson Jan 1, 2026
ebf63d8
Add my transactions to user menu, and display transactions and subscr…
thomasgwatson Jan 2, 2026
8acbf11
Update backend readme with stripe details
thomasgwatson Jan 2, 2026
78cfc37
Allow users to see their transaction/subscriptions, and manage subscr…
thomasgwatson Jan 2, 2026
15dd17f
Merge branch 'dev' into 604-paid-content
thomasgwatson Jan 2, 2026
a264967
Add optional donations to hylo transactions
thomasgwatson Jan 5, 2026
ee45f42
Add emails to many of the paid content actions
thomasgwatson Jan 7, 2026
fe6d062
Merge branch 'color-scheme' into 604-paid-content
thomasgwatson Jan 7, 2026
e6d7fc0
Update offering urls to redirect to the about page
thomasgwatson Jan 8, 2026
c33afe6
Update test scenarios and add one day subscriptions
thomasgwatson Jan 8, 2026
86964e4
Add revoke button for content access records
thomasgwatson Jan 8, 2026
ab03164
disable donations for now
thomasgwatson Jan 9, 2026
7faec33
Try to fix staging again
tibetsprague Jan 9, 2026
f2449c3
Fix staging
tibetsprague Jan 9, 2026
2db9570
Add set donation line item for hylo donations
thomasgwatson Jan 10, 2026
da90aa4
Renable refunds with the correct logic
thomasgwatson Jan 11, 2026
cd95ba9
Remove conditional for offerings create/edit ui
thomasgwatson Jan 14, 2026
6caeeee
Flesh out the paid content interactions with roles to make sure they …
thomasgwatson Jan 16, 2026
9304792
Merge branch 'dev' into 604-paid-content
thomasgwatson Jan 16, 2026
83d2e83
Merge branch 'dev' into 604-paid-content
thomasgwatson Jan 16, 2026
c08b04a
Merge branch '604-paid-content' of https://github.com/Hylozoic/hylo i…
thomasgwatson Jan 16, 2026
a87433d
Add filters to user transactions list
thomasgwatson Jan 18, 2026
03bb536
Add filters to my transactions user tab; re-position tab in user menu
thomasgwatson Jan 19, 2026
2317ce7
Further fixes to how roles are handled by content access and transact…
thomasgwatson Jan 28, 2026
274748c
Further tweaks to how roles are handled by content access records and…
thomasgwatson Jan 28, 2026
d639b7d
Fix tracks enrollment display logic in TrackHome view
thomasgwatson Jan 28, 2026
a0228b2
Fix join flow; actually save pre-answered join questions and dont ask…
thomasgwatson Jan 30, 2026
86c4e17
PAID CONTENT: Ensure membership is created before roles are granted
thomasgwatson Jan 30, 2026
816adb3
Improve UX of My transactions and the filters
thomasgwatson Jan 30, 2026
127a816
Merge branch 'dev' into 604-paid-content
thomasgwatson Feb 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion apps/backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,9 @@ SEGMENT_KEY=xxxx
SENDWITHUS_KEY=
SLACK_APP_CLIENT_ID=XXX
SLACK_APP_CLIENT_SECRET=XXX
STRIPE_API_KEY=
# Stripe API Keys - Get these from https://dashboard.stripe.com/apikeys
# Use test keys (starting with sk_test_ and pk_test_) for development
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
UPLOADER_PATH_PREFIX=evo-uploads
STRIPE_WEBHOOK_SECRET=
4 changes: 4 additions & 0 deletions apps/backend/Procfile.dev-stripe
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
web: nodemon --inspect=3002 --ext js,json,graphql app.js --delay=0.5
worker: DELAY_START=5 nodemon worker.js --delay=0.5
stripe: stripe listen --forward-to localhost:3001/noo/stripe/webhook

75 changes: 75 additions & 0 deletions apps/backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,81 @@ Change your `.env` file to have:
PROTOCOL=https
```

### Stripe Integration (Local Development)

To test Stripe webhooks locally, you need to install the Stripe CLI and forward webhook events to your local server.

#### Installing the Stripe CLI

**macOS (Homebrew):**
```shell
brew install stripe/stripe-cli/stripe
```

**Linux:**
```shell
# Download the latest linux tar.gz from https://github.com/stripe/stripe-cli/releases/latest
tar -xvf stripe_X.X.X_linux_x86_64.tar.gz
sudo mv stripe /usr/local/bin
```

For other installation methods, see the [Stripe CLI documentation](https://stripe.com/docs/stripe-cli#install).

#### Setting Up Your Stripe Sandbox Environment

Before you can test Stripe locally, you need access to a personal sandbox environment:

1. **Get access to the team Stripe account** - Ask an existing team member with admin permissions on the Stripe account to invite you to the Hylo Stripe team.

2. **Create your personal sandbox** - Once you have access, log into the [Stripe Dashboard](https://dashboard.stripe.com) and create a sandbox environment by cloning the production configuration:
- Navigate to the sandbox/test environment selector (top-left of dashboard)
- Click "New sandbox" or ask a team member with permissions to create one for you
- Clone from the production environment to get all the existing products, prices, and webhook configurations

3. **Get your sandbox API keys** - In your sandbox environment:
- Go to Developers → API keys
- Copy your **Publishable key** (`pk_test_...`) and **Secret key** (`sk_test_...`)

4. **Add the keys to your `.env` file**:
```
STRIPE_PUBLISHABLE_KEY=pk_test_your_publishable_key_here
STRIPE_SECRET_KEY=sk_test_your_secret_key_here
```

#### Authenticating with Stripe CLI

After installing the CLI, authenticate with your Stripe account:
```shell
stripe login
```

This will open a browser window to complete the authentication. Make sure you select your personal sandbox environment when prompted.

#### Listening for Webhook Events

To forward Stripe webhook events to your local backend server, run:
```shell
stripe listen --forward-to localhost:3001/noo/stripe/webhook
```

This will output a webhook signing secret that looks like `whsec_...`. Copy this value and add it to your `.env` file:
```
STRIPE_WEBHOOK_SECRET=whsec_your_signing_secret_here
```

**Note:** The webhook signing secret changes each time you run `stripe listen`, so you'll need to update your `.env` file accordingly when restarting the listener.

#### Triggering Test Events

You can trigger test webhook events to verify your integration:
```shell
stripe trigger checkout.session.completed
stripe trigger customer.subscription.created
stripe trigger invoice.paid
```

For more information about Stripe webhooks, see the [Stripe Webhooks documentation](https://stripe.com/docs/webhooks).

### Setting up to handle auth with JWTs and become an OpenID Connect provider
- Run `yarn generate-rsa-key-base64`
- Copy generated base64 string to .env file: `OIDC_KEYS=base64key`
Expand Down
Loading