Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
61a0934
Add jotform webhooks for Oura
toddkazakov Dec 4, 2025
599118c
Use the configured jotform API base url
toddkazakov Dec 5, 2025
48c809f
Ensure user exists before creating consent
toddkazakov Dec 8, 2025
01c769f
Parse date time fields correctly
toddkazakov Dec 8, 2025
aea76a4
Add tests for jotform webhooks
toddkazakov Dec 9, 2025
e29bcbf
Process oura sizing kit fulfillment webhooks from shopify
toddkazakov Dec 12, 2025
da418c4
Add tests for fulfillment event webhooks
toddkazakov Dec 15, 2025
9a99e16
Add shopify webhook routes
toddkazakov Dec 16, 2025
80d6b51
Use fulfillment created/updated instead of fulfillment_events to allo…
toddkazakov Dec 17, 2025
0242687
Use test store product id
toddkazakov Dec 17, 2025
20a5de8
Use product GID when creating discount code
toddkazakov Dec 17, 2025
a4b8333
Configure discount codes correctly
toddkazakov Dec 17, 2025
a951e35
Fix default customer.io track api base url
toddkazakov Dec 17, 2025
27ec01d
Use id instead of cid when sending events to customer io
toddkazakov Dec 17, 2025
d0d7ec6
Remove some of the unused fields of the fulfillment event
toddkazakov Dec 17, 2025
a3aa538
Add webhook for orders create events to notify customer.io of placed …
toddkazakov Dec 18, 2025
9995641
Add tests for shopify orders
toddkazakov Dec 23, 2025
a9e257a
Generate account linking code when ring is delivered
toddkazakov Jan 5, 2026
6b33383
Add oura account linking token expiration time
toddkazakov Jan 5, 2026
8af6266
Address code review feedback
toddkazakov Jan 9, 2026
902c7f8
Refactor work for common functionality
darinkrauss Jan 12, 2026
e32ca74
Minor updates
darinkrauss Jan 12, 2026
d0e99a7
Reorganize the oura releated code
toddkazakov Jan 12, 2026
7b057b0
Use the client module to implement the customerio client
toddkazakov Jan 12, 2026
002e3c0
Remove unused variable
toddkazakov Jan 12, 2026
e52c935
Remove import alias
toddkazakov Jan 13, 2026
818a57d
Merge pull request #901 from tidepool-org/tk-oura-webhooks-shopify
toddkazakov Jan 14, 2026
e814043
Updates based upon PR review
darinkrauss Jan 15, 2026
dc31f3e
Updates base upon PR review
darinkrauss Jan 15, 2026
85580eb
Merge branch 'BACK-3960-oura-connection' into darin/refactor-work
darinkrauss Jan 18, 2026
df0ce7f
Minor cleanup and additional tests
darinkrauss Jan 19, 2026
9a9f5b1
Various auth and oauth package refactoring
darinkrauss Jan 20, 2026
918c7b8
Add new functionality required for Oura integration
darinkrauss Jan 20, 2026
f70032b
Add Oura OAuth implementation
darinkrauss Jan 20, 2026
24b77dd
Updates based upon PR review
darinkrauss Jan 21, 2026
4b97c02
Merge pull request #903 from tidepool-org/darin/refactor-work
darinkrauss Jan 22, 2026
86c08f8
Merge pull request #906 from tidepool-org/darin/oura-oauth-workflow
darinkrauss Jan 22, 2026
2d47110
Merge pull request #904 from tidepool-org/darin/refactor-auth
darinkrauss Jan 22, 2026
637c26f
Merge pull request #905 from tidepool-org/darin/oura-requirements
darinkrauss Jan 22, 2026
97f74ab
Merge pull request #906 from tidepool-org/darin/oura-oauth-workflow
darinkrauss Jan 22, 2026
6db0fea
Merge branch 'master' into BACK-3960-oura-connection
darinkrauss Jan 22, 2026
7e4d663
Update to latest platform-plugin-abbott
darinkrauss Jan 22, 2026
f8dd36a
Add reconciler for jotform subsmissions
toddkazakov Jan 16, 2026
e0b6eab
Use the work system to reconcile jotform submissions
toddkazakov Jan 20, 2026
51e0d99
Use the configured form id when reconciling submissions
toddkazakov Jan 20, 2026
c72e04d
Add failing retry count
toddkazakov Jan 21, 2026
d75caae
Fix typo
toddkazakov Jan 22, 2026
ecf7984
Use header auth for jotform
toddkazakov Jan 22, 2026
2470fbc
Persist raw jotform submission content as bson.Raw
toddkazakov Jan 22, 2026
35fcfee
Set the work item to pending state
toddkazakov Jan 23, 2026
5e84019
Refactor jotform reconciler
toddkazakov Jan 23, 2026
82fa9c2
Process submissions in reverse order
toddkazakov Jan 23, 2026
b33e407
Add unit tests for the jotform reconciler
toddkazakov Jan 26, 2026
01b7371
Address code review feedback
toddkazakov Jan 28, 2026
a074601
Use early returns instead of breaking out of for loops
toddkazakov Jan 29, 2026
af489b2
Merge pull request #907 from tidepool-org/tk-oura-reconcile
toddkazakov Jan 29, 2026
3c63618
Create an empty oura data source if one doesn't exist already
toddkazakov Feb 11, 2026
fa1f38f
Send event to customer io when an oura data source is connected
toddkazakov Feb 11, 2026
90b0826
Address code review feedback
toddkazakov Feb 13, 2026
7dfc014
Address code review feedback
toddkazakov Feb 16, 2026
ed20de9
Use the oura participant id as deduplication id for jotform subsmissi…
toddkazakov Feb 17, 2026
b352816
Keep track of processed shopify orders
toddkazakov Feb 17, 2026
8b90905
Reactor shopify even processing to facilitate easier reconcilation
toddkazakov Feb 18, 2026
0c4c9d4
Add reconciler for shopify orders
toddkazakov Feb 19, 2026
547be13
Merge pull request #911 from tidepool-org/tk-oura-account-linking-events
toddkazakov Feb 25, 2026
0db4814
Use the updated (connected) data source to create customer.io events
toddkazakov Mar 4, 2026
50902d9
Merge pull request #913 from tidepool-org/tk-back-4249
toddkazakov Mar 4, 2026
aa5e0a3
Merge branch 'master' into BACK-3960-oura-connection
darinkrauss Mar 9, 2026
c6037bd
Address code review feedback
toddkazakov Mar 20, 2026
2326789
Use the updated (connected) data source to create customer.io events
toddkazakov Mar 4, 2026
a35711b
Add jotform team id header for accessing our enterprise account
toddkazakov Mar 19, 2026
806eba5
Add ability to disable the jotform processor
toddkazakov Mar 19, 2026
3317298
Store the last processed last submission id even when jotform is disa…
toddkazakov Mar 19, 2026
f5c1542
Improve logging
toddkazakov Mar 19, 2026
62779d1
Populate the gid of the order
toddkazakov Mar 20, 2026
5427479
Allow processing orders with multiple fulfillments
toddkazakov Mar 23, 2026
a542190
Address code review feedback
toddkazakov Mar 23, 2026
af7d11e
Merge pull request #912 from tidepool-org/tk-shopify-reconcile
toddkazakov Mar 24, 2026
1dd68d5
Merge pull request #925 from tidepool-org/tk-jotform-improvements
toddkazakov Mar 24, 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
11 changes: 0 additions & 11 deletions .vscode/settings.json

This file was deleted.

18 changes: 6 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -263,38 +263,32 @@ ci-test: ci-test-go
test-ginkgo: ginkgo
@echo "ginkgo $(GINKGO_FLAGS) $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && $(TIMING_CMD) ginkgo $(GINKGO_FLAGS) $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off $(TIMING_CMD) ginkgo $(GINKGO_FLAGS) $${GOWORK_FLAGS:-} $(TEST)

test-ginkgo-until-failure: ginkgo
@echo "ginkgo $(GINKGO_FLAGS) -untilItFails $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && ginkgo $(GINKGO_FLAGS) -untilItFails $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off ginkgo $(GINKGO_FLAGS) -untilItFails $${GOWORK_FLAGS:-} $(TEST)

test-ginkgo-watch: ginkgo
@echo "ginkgo watch $(GINKGO_FLAGS) $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && ginkgo watch $(GINKGO_FLAGS) $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off ginkgo watch $(GINKGO_FLAGS) $${GOWORK_FLAGS:-} $(TEST)

ci-test-ginkgo: ginkgo
@echo "ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && $(TIMING_CMD) ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off $(TIMING_CMD) ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) $${GOWORK_FLAGS:-} $(TEST)

ci-test-ginkgo-until-failure: ginkgo
@echo "ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) -untilItFails $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) -untilItFails $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off ginkgo $(GINKGO_FLAGS) $(GINKGO_CI_FLAGS) -untilItFails $${GOWORK_FLAGS:-} $(TEST)

ci-test-ginkgo-watch: ginkgo
@echo "ginkgo watch $(GINKGO_FLAGS) $(GINKGO_CI_WATCH_FLAGS) $(TEST)"
@cd $(ROOT_DIRECTORY) && \
{ [ -z `go env GOWORK` ] || GOWORK_FLAGS=-mod=readonly; } && \
. ./env.test.sh && ginkgo watch $(GINKGO_FLAGS) $(GINKGO_CI_WATCH_FLAGS) $${GOWORK_FLAGS:-} $(TEST)
. ./env.test.sh && GOWORK=off ginkgo watch $(GINKGO_FLAGS) $(GINKGO_CI_WATCH_FLAGS) $${GOWORK_FLAGS:-} $(TEST)

test-go:
@echo "go test $(GOTEST_FLAGS) $(GOTEST_PKGS)"
Expand Down
6 changes: 6 additions & 0 deletions auth/providersession/provider_session.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package providersession

import "github.com/tidepool-org/platform/auth"

//go:generate mockgen -destination=test/provider_session_mocks.go -package=test --mock_names=ProviderSessionAccessor=MockClient github.com/tidepool-org/platform/auth ProviderSessionAccessor
type Client auth.ProviderSessionAccessor
132 changes: 132 additions & 0 deletions auth/providersession/test/provider_session_mocks.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

80 changes: 80 additions & 0 deletions auth/providersession/work/mixin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package work

import (
"context"

"github.com/tidepool-org/platform/auth"
providerSession "github.com/tidepool-org/platform/auth/providersession"
"github.com/tidepool-org/platform/errors"
"github.com/tidepool-org/platform/log"
"github.com/tidepool-org/platform/work"
workBase "github.com/tidepool-org/platform/work/base"
)

const MetadataKeyID = "providerSessionId"

type Mixin struct {
*workBase.Processor
Client providerSession.Client
ProviderSession *auth.ProviderSession
}

func NewMixin(processor *workBase.Processor, client providerSession.Client) (*Mixin, error) {
if processor == nil {
return nil, errors.New("processor is missing")
}
if client == nil {
return nil, errors.New("client is missing")
}
return &Mixin{
Processor: processor,
Client: client,
}, nil
}

func (m *Mixin) ProviderSessionIDFromMetadata() (*string, error) {
parser := m.MetadataParser()
providerSessionID := parser.String(MetadataKeyID)
if err := parser.Error(); err != nil {
return nil, errors.Wrap(err, "unable to parse provider session id from metadata")
}
return providerSessionID, nil
}

func (m *Mixin) FetchProviderSessionFromMetadata() *work.ProcessResult {
providerSessionID, err := m.ProviderSessionIDFromMetadata()
if err != nil || providerSessionID == nil {
return m.Failed(errors.Wrap(err, "unable to get provider session id from metadata"))
}
return m.FetchProviderSession(*providerSessionID)
}

func (m *Mixin) FetchProviderSession(providerSessionID string) *work.ProcessResult {
providerSession, err := m.Client.GetProviderSession(m.Context(), providerSessionID)
if err != nil {
return m.Failing(errors.Wrap(err, "unable to fetch provider session"))
} else if providerSession == nil {
return m.Failed(errors.New("provider session is missing"))
}
m.ProviderSession = providerSession

m.AddFieldToContext("providerSession", log.Fields{"id": m.ProviderSession.ID, "userId": m.ProviderSession.UserID})

return nil
}

func (m *Mixin) UpdateProviderSession(providerSessionUpdate auth.ProviderSessionUpdate) *work.ProcessResult {
if m.ProviderSession == nil {
return m.Failed(errors.New("provider session is missing"))
}

providerSession, err := m.Client.UpdateProviderSession(context.WithoutCancel(m.Context()), m.ProviderSession.ID, &providerSessionUpdate)
if err != nil {
return m.Failing(errors.Wrap(err, "unable to update provider session"))
} else if providerSession == nil {
return m.Failed(errors.New("provider session is missing"))
}
m.ProviderSession = providerSession

return nil
}
Loading
Loading