Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
d0ce7b2
feat(users): queue a deleted user's provider unlink and drain it from…
CK-7vn Nov 3, 2026
4e698c0
feat: run Provider Platforms as its own service (EN-206)
CK-7vn Nov 3, 2026
5367d8b
docs(dev): build and run the Provider Platforms service with compose …
CK-7vn Nov 3, 2026
671e979
fix(tests): make the fake Provider Platforms service a regular file (…
CK-7vn Nov 3, 2026
6546302
build: pin unlocked-contracts to PR #7's head until v0.4.0 is tagged …
CK-7vn Nov 3, 2026
fe97d6e
test(handlers): refuse Provider Platforms callers before they reach t…
CK-7vn Nov 3, 2026
e17e56d
fix(compose): give the Kolibri settings to providerplatforms, which n…
CK-7vn Nov 4, 2026
087fd0e
refactor(programs): take the Provider Platforms client as a value, no…
CK-7vn Nov 4, 2026
e411919
Merge remote-tracking branch 'origin/main' into EN-206-move-provider-…
CK-7vn Nov 5, 2026
3fcda47
fix(server): refuse to start without PROVIDER_PLATFORMS_TOKEN, like O…
CK-7vn Nov 5, 2026
f39c023
feat(make): build, migrate and seed Provider Platforms like Open Cont…
CK-7vn Nov 5, 2026
1552c42
refactor(tasks): move the deleted-user unlink loop out of the databas…
CK-7vn Nov 5, 2026
a3c5ff2
style: group the contracts imports the merge with main left in one bl…
CK-7vn Nov 5, 2026
a448d31
test(handlers): cover the outcomes and logins user checks the contrac…
CK-7vn Nov 5, 2026
c7bd328
fix(deps): pin contracts to #7's current head after its rebase (EN-206)
CK-7vn Nov 5, 2026
f42d49b
chore: drop the migrations build output the main merge picked up (EN-…
CK-7vn Nov 5, 2026
bd8824a
fix(deps): pin unlocked-contracts to v0.4.0 (EN-206)
CK-7vn Nov 5, 2026
d747414
docs: drop the private-repo note, since unlocked-provider-platforms g…
CK-7vn Nov 5, 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
5 changes: 3 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ HYDRA_ADMIN_TOKEN=eyJvZmZzZXQiOiItMjUwIiwidiI6Mn0
KRATOS_ADMIN_URL=http://127.0.0.1:4434
KRATOS_PUBLIC_URL=http://127.0.0.1:4433
KRATOS_URL=127.0.0.1:4433
PROVIDER_SERVICE_KEY=NTQxODNmNDMyM2YzNzdiNzM3NDMzYTFlOTgyMjllYWQwZmRjNjg2ZjkzYmFiMDU3ZWNiNjEyZGFhOTQwMDJiNSAgLQo=
PROVIDER_SERVICE_URL=http://localhost:8081
OPEN_CONTENT_URL=http://localhost:8082
OPEN_CONTENT_TOKEN=dev-open-content-token
# The Provider Platforms service (EN-206) and the secret core shares with it.
PROVIDER_PLATFORMS_URL=http://127.0.0.1:8083
PROVIDER_PLATFORMS_TOKEN=dev-provider-platforms-token
KOLIBRI_DB_PASSWORD=dev
KOLIBRI_USERNAME=SuperAdmin
KOLIBRI_PASSWORD=ChangeMe!
Expand Down
54 changes: 34 additions & 20 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ DEFAULT_AI_DIR=../ai/unlocked-hiset-ai
OPEN_CONTENT_REPO=https://github.com/UnlockedLabs/unlocked-open-content.git
# Open Content's one-off commands run in its migrate service's container.
OPEN_CONTENT_RUN=docker compose run --rm --no-deps open-content-migrate
# Provider Platforms runs as its own service (EN-206), built the same way:
# PROVIDER_PLATFORMS_REF from GitHub, or your checkout in PROVIDER_PLATFORMS_DIR.
PROVIDER_PLATFORMS_REPO=https://github.com/UnlockedLabs/unlocked-provider-platforms.git
PROVIDER_PLATFORMS_RUN=docker compose run --rm --no-deps providerplatforms-migrate
# Canvas admin created on first `make canvas`. Override in the environment if
# you want different credentials. These are also what you log into Canvas with
# at localhost:3001 to mint the API token.
Expand Down Expand Up @@ -53,22 +57,28 @@ define run_dev_compose
fi; \
export GIT_COMMIT=$$(git rev-parse --short HEAD 2>/dev/null || echo unknown); \
export GIT_BRANCH=$$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown); \
OC_DIR=$${OPEN_CONTENT_DIR:-$$(sed -n 's/^OPEN_CONTENT_DIR=//p' .env | tail -1)}; \
if [ -n "$$OC_DIR" ]; then \
if [ ! -d "$$OC_DIR" ]; then \
echo "OPEN_CONTENT_DIR is $$OC_DIR, but there's no checkout there. Clone it, or unset OPEN_CONTENT_DIR to build Open Content from GitHub."; \
exit 1; \
build_source() { \
var=$$1; label=$$2; repo=$$3; dir_var=$${var}_DIR; ref_var=$${var}_REF; \
dir=$${!dir_var:-$$(sed -n "s/^$${var}_DIR=//p" .env | tail -1)}; \
if [ -n "$$dir" ]; then \
if [ ! -d "$$dir" ]; then \
echo "$$dir_var is $$dir, but there's no checkout there. Clone it, or unset $$dir_var to build $$label from GitHub."; \
return 1; \
fi; \
branch=$$(git -C "$$dir" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown); \
commit=$$(git -C "$$dir" rev-parse --short HEAD 2>/dev/null || echo unknown); \
echo "Building $$label from your checkout $$dir @ $$branch ($$commit)"; \
else \
ref=$${!ref_var:-$$(sed -n "s/^$${var}_REF=//p" .env | tail -1)}; \
branch=$${ref:-main}; \
commit=$$(git ls-remote "$$repo" "refs/heads/$$branch" 2>/dev/null | cut -c1-7); \
commit=$${commit:-unknown}; \
echo "Building $$label from GitHub @ $$branch ($$commit)"; \
fi; \
export OPEN_CONTENT_GIT_COMMIT=$$(git -C "$$OC_DIR" rev-parse --short HEAD 2>/dev/null || echo unknown); \
export OPEN_CONTENT_GIT_BRANCH=$$(git -C "$$OC_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo unknown); \
echo "Building Open Content from your checkout $$OC_DIR @ $$OPEN_CONTENT_GIT_BRANCH ($$OPEN_CONTENT_GIT_COMMIT)"; \
else \
OC_REF=$${OPEN_CONTENT_REF:-$$(sed -n 's/^OPEN_CONTENT_REF=//p' .env | tail -1)}; \
export OPEN_CONTENT_GIT_BRANCH=$${OC_REF:-main}; \
OC_COMMIT=$$(git ls-remote $(OPEN_CONTENT_REPO) "refs/heads/$$OPEN_CONTENT_GIT_BRANCH" 2>/dev/null | cut -c1-7); \
export OPEN_CONTENT_GIT_COMMIT=$${OC_COMMIT:-unknown}; \
echo "Building Open Content from GitHub @ $$OPEN_CONTENT_GIT_BRANCH ($$OPEN_CONTENT_GIT_COMMIT)"; \
fi; \
export "$${var}_GIT_BRANCH=$$branch" "$${var}_GIT_COMMIT=$$commit"; \
}; \
build_source OPEN_CONTENT "Open Content" $(OPEN_CONTENT_REPO) || exit 1; \
build_source PROVIDER_PLATFORMS "Provider Platforms" $(PROVIDER_PLATFORMS_REPO) || exit 1; \
AI_DIR=$${TUTOR_DIR:-$$(sed -n 's/^TUTOR_DIR=//p' .env | tail -1)}; \
AI_DIR=$${AI_DIR:-$(DEFAULT_AI_DIR)}; \
TUTOR_READY=0; TUTOR_WHY=; \
Expand Down Expand Up @@ -233,19 +243,22 @@ install-dep: ascii_art
fi
docker compose down && docker volume rm -f unlockedv2_node_modules && cd frontend && yarn add $(NAME) && cd ..
$(call run_dev_compose,)
# Open Content's migrations roll back first, since they move tables that
# core's reset drops, and run again after it. Its services restart because
# their connections switch to the role the reset recreates, and the worker
# seeds the fresh database when it starts.
# Open Content's and Provider Platforms' migrations roll back first, since they
# move tables that core's reset drops, and run again after it. Their services
# restart because their connections switch to the role the reset recreates, and
# Open Content's worker seeds the fresh database when it starts.
migrate-fresh: ascii_art
$(OPEN_CONTENT_RUN) migrate-reset
$(PROVIDER_PLATFORMS_RUN) migrate-reset
go run -tags dev $(MIGRATE_MAIN) --fresh
$(OPEN_CONTENT_RUN) migrate
docker compose restart open-content open-content-worker
$(PROVIDER_PLATFORMS_RUN) migrate
docker compose restart open-content open-content-worker providerplatforms providerplatforms-worker

migrate: ascii_art
go run $(MIGRATE_MAIN)
$(OPEN_CONTENT_RUN) migrate
$(PROVIDER_PLATFORMS_RUN) migrate

kolibri: ascii_art
$(call run_dev_compose,-f $(DOCKER_COMPOSE) -f $(KOLIBRI_COMPOSE))
Expand Down Expand Up @@ -277,6 +290,7 @@ canvas-seed: ascii_art
seed: ascii_art
go run $(SEED_MAIN)
$(OPEN_CONTENT_RUN) seed-dev
$(PROVIDER_PLATFORMS_RUN) seed-dev

build: ascii_art
@if [ -z "$(ACCOUNT_ID)" ]; then \
Expand Down
27 changes: 14 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ a checkout of it. To work on it, clone it and set `OPEN_CONTENT_DIR` in `.env` t
(such as `../unlocked-open-content`); `make dev` then builds your changes. To try another branch
without a checkout, such as one in review, set `OPEN_CONTENT_REF` to the branch name.

**Provider Platforms** ([unlocked-provider-platforms](https://github.com/UnlockedLabs/unlocked-provider-platforms))
runs as its own service the same way: `make dev` builds its `main` branch from GitHub, or your
checkout when `PROVIDER_PLATFORMS_DIR` is set (such as `../unlocked-provider-platforms`), or another
branch with `PROVIDER_PLATFORMS_REF`. Core forwards its `/api` routes to it and both call each other
with `PROVIDER_PLATFORMS_TOKEN`; if you run the server outside compose, `.env.example` points
`PROVIDER_PLATFORMS_URL` at its port, 8083.


**NOTE:** you _must_ be sure to use `127.0.0.1` in place of `localhost` in your browser, as the cookies required for authentication are not shared between the two,
and this can cause bad states in the browser that will prevent successful login/auth flow.
Expand Down Expand Up @@ -116,22 +123,16 @@ If this does not work because your directory is named something different, you c
- `make canvas-init` and `make canvas-seed` are still available for doing either step by hand --
re-seeding, or re-creating the database after `docker compose ... down --volumes`.

To connect UnlockEd to it, first run `make seed` if you have not already. `make canvas` seeds
only the Canvas LMS database, so on a fresh UnlockEd database the `Canvas` provider platform the
next step asks you to edit does not exist yet.

Then log in to Canvas at `localhost:3001` as that admin, go to Account -> Settings ->
To connect UnlockEd to it, log in to Canvas at `localhost:3001` as that admin, go to Account -> Settings ->
New Access Token, and copy the token. Back in UnlockEd, enable the `provider_platforms` feature
flag for your facility (every Canvas call is gated on it) and edit the seeded `Canvas` provider
platform, pasting the token you just copied into `access_key`.

That is the only field you need to fill in. `make seed` points the platform at the local
Canvas (`base_url` `http://canvas`, `account_id` `1`) and leaves it enabled; the access key is
the one value that can't be seeded, since you mint it per machine.
flag for your facility (every Canvas call is gated on it) and edit the Canvas provider platform
`make seed` added (Provider Platforms' `seed-dev`): `base_url` `http://canvas`, `account_id` `1`,
and paste the token you just copied as its `access_key`.

**Note** the base url is `http://canvas`, not `localhost:3001`. UnlockEd calls the Canvas API
from inside the `server` and `providerplatforms-worker` containers, so it needs the compose service
name. `localhost:3001` only works from your browser.
from inside the `providerplatforms` and `providerplatforms-worker` containers, so it needs the
compose service name. `localhost:3001` only works from your browser.


- **Videos**:
Videos can be hosted locally for development, in which case they are simply downloaded and moved into the `frontend/public/videos` directory,
Expand Down
17 changes: 2 additions & 15 deletions backend/.golangci.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
version: "2"

# golangci-lint's standard linters (what CI ran before this file existed) plus
# depguard for the feature-module boundaries (EN-190).
# depguard for the feature-module boundaries (EN-190). Open Content and Provider
# Platforms aren't here: they are their own services (EN-205, EN-206).
linters:
default: standard
enable:
Expand All @@ -28,7 +29,6 @@ linters:
allow:
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/module
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/registry
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/providerplatforms/api
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/programs/api
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/learningrecord/api
# The seam imports nothing from core. depguard only sees each file's
Expand All @@ -42,17 +42,6 @@ linters:
desc: the module seam must not expose core types to feature modules (EN-188)
allow:
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/module
providerplatforms:
list-mode: lax
files: ["**/src/modules/providerplatforms/**"]
deny:
- pkg: github.com/UnlockedLabs/unlocked-core/backend
desc: a feature module reaches core only through src/modules/module and unlocked-contracts, and other modules only through their api package (EN-186, EN-188)
allow:
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/module
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/providerplatforms
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/programs/api
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/learningrecord/api
programs:
list-mode: lax
files: ["**/src/modules/programs/**"]
Expand All @@ -62,7 +51,6 @@ linters:
allow:
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/module
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/programs
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/providerplatforms/api
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/learningrecord/api
learningrecord:
list-mode: lax
Expand All @@ -73,5 +61,4 @@ linters:
allow:
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/module
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/learningrecord
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/providerplatforms/api
- github.com/UnlockedLabs/unlocked-core/backend/src/modules/programs/api
16 changes: 15 additions & 1 deletion backend/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ func main() {
if !testing && os.Getenv("OPEN_CONTENT_TOKEN") == "" {
log.Fatal("OPEN_CONTENT_TOKEN must be set: it's the secret the server asks Open Content's questions with")
}
if !testing {
requireProviderPlatformsToken()
}
srv := server.NewServer(testing, ctx)
if srv == nil {
log.Info("Server stopped before migrations finished")
Expand All @@ -64,6 +67,15 @@ func main() {
srv.ListenAndServe(ctx)
}

// requireProviderPlatformsToken stops the server and the scheduler without the
// secret they call the Provider Platforms service with (EN-206): every call
// would be refused.
func requireProviderPlatformsToken() {
if registry.ProviderPlatformsToken() == "" {
log.Fatal("PROVIDER_PLATFORMS_TOKEN must be set: it's the secret the server and the scheduler call Provider Platforms with")
}
}

func cancelOnSignal(shutdown <-chan os.Signal, cancel context.CancelFunc) {
sig := <-shutdown
log.Infof("Received signal: %v. Initiating shutdown...", sig)
Expand All @@ -75,14 +87,16 @@ func cancelOnSignal(shutdown <-chan os.Signal, cancel context.CancelFunc) {
// until ctx is canceled. It doesn't migrate: it waits until the database
// is migrated.
func runScheduler(ctx context.Context) {
requireProviderPlatformsToken()
mods := registry.All()
nc, db, ok := connectMigrated(ctx)
defer nc.Close()
if !ok {
log.Info("Scheduler stopped before migrations finished")
return
}
s := tasks.Start(nc, mods, database.OpenModuleDBs(db, mods))
moduleDBs := database.OpenModuleDBs(db, mods)
s := tasks.Start(nc, mods, moduleDBs, database.NewDB(db), registry.ProviderPlatforms())
log.Info("Scheduler started")
<-ctx.Done()
if err := s.Stop(); err != nil {
Expand Down
8 changes: 1 addition & 7 deletions backend/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,16 @@ require (
github.com/stretchr/testify v1.11.1
github.com/teambition/rrule-go v1.8.2
golang.org/x/net v0.60.0 // indirect
golang.org/x/oauth2 v0.34.0
gorm.io/driver/postgres v1.6.0
gorm.io/gorm v1.31.1
)

require (
github.com/UnlockedLabs/unlocked-contracts v0.3.0
github.com/adrg/strutil v0.3.1
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1
github.com/microcosm-cc/bluemonday v1.0.27
github.com/UnlockedLabs/unlocked-contracts v0.4.0
github.com/xuri/excelize/v2 v2.11.1-0.20260915055537-22f76f9acb94
)

require (
github.com/aymerick/douceur v0.2.0 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/richardlehane/mscfb v1.0.8 // indirect
github.com/richardlehane/msoleps v1.0.6 // indirect
github.com/tiendc/go-deepcopy v1.7.2 // indirect
Expand Down
21 changes: 2 additions & 19 deletions backend/go.sum
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
github.com/UnlockedLabs/unlocked-contracts v0.3.0 h1:aq+4XIVjHRb4qC77PzLbixo7XdwYHge9Fd5SCvX/ISA=
github.com/UnlockedLabs/unlocked-contracts v0.3.0/go.mod h1:RAEqqBigq/Gu5ARxWKsSjN34B2N3GlEyGX8DjHjKxK0=
github.com/adrg/strutil v0.3.1 h1:OLvSS7CSJO8lBii4YmBt8jiK9QOtB9CzCzwl4Ic/Fz4=
github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4=
github.com/UnlockedLabs/unlocked-contracts v0.4.0 h1:289y2TWKGdi1S6/DHlzxark3wZJICdEggLoyXiPfWQ4=
github.com/UnlockedLabs/unlocked-contracts v0.4.0/go.mod h1:RAEqqBigq/Gu5ARxWKsSjN34B2N3GlEyGX8DjHjKxK0=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
Expand Down Expand Up @@ -33,16 +29,12 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=
github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1 h1:FWNFq4fM1wPfcK40yHE5UO3RUdSNPaBC+j3PokzA6OQ=
github.com/gocarina/gocsv v0.0.0-20240520201108-78e41c74b4b1/go.mod h1:5YoVOkjYAQumqlV356Hj3xeYh4BdZuLE0/nRkf2NKkI=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs=
github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
Expand Down Expand Up @@ -75,8 +67,6 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/nats-io/nats.go v1.48.0 h1:pSFyXApG+yWU/TgbKCjmm5K4wrHu86231/w84qRVR+U=
Expand Down Expand Up @@ -116,13 +106,8 @@ github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLy
github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w=
github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/teambition/rrule-go v1.8.2 h1:lIjpjvWTj9fFUZCmuoVDrKVOtdiyzbzc93qTmRVe/J8=
Expand Down Expand Up @@ -151,8 +136,6 @@ golang.org/x/mod v0.41.0 h1:qJmnOUb4YB+FsEuM3HcWucdZASCPGhsX6uljO6pog0c=
golang.org/x/mod v0.41.0/go.mod h1:Ek9pY8RKWXwsWvd3rQiHYtMqkjSUV+s1Rj7j4H5Ur6o=
golang.org/x/net v0.60.0 h1:79p50tfZlm0J9YfoDsSi639qSXNGVwEzOPLCxM2FsYU=
golang.org/x/net v0.60.0/go.mod h1:2DA/G1UfVbCpQPeWTmMPGY7Cs2PkBkwu743bVX5PIVg=
golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.23.0 h1:KameEIfc1IkluZyXWLn39Wd4tURc6GbCiISGiZm2bQk=
golang.org/x/sync v0.23.0/go.mod h1:sUUOizhqBxiL6pEWpqNLUiaJn1ShEbZ6BBqskPbjZm0=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
Expand Down
11 changes: 11 additions & 0 deletions backend/migrations/00080_provider_mapping_deletions.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-- +goose Up
-- Users deleted while Provider Platforms, now its own service, still has their
-- account links to remove (EN-206). DeleteUser queues a row in the same
-- transaction; a job removes it once Provider Platforms has unlinked the user.
CREATE TABLE public.provider_mapping_deletions (
user_id bigint PRIMARY KEY,
created_at timestamptz NOT NULL DEFAULT now()
);

-- +goose Down
DROP TABLE public.provider_mapping_deletions;
Loading
Loading