Initial scaffold: Shopify recesso (withdrawal) compliance app

- Remix (TypeScript) + Polaris, official Shopify app template
- Prisma multi-tenant schema (Settings, ExclusionRule, WithdrawalRequest, AuditLog, WebhookEvent) on Postgres
- Mandatory GDPR compliance webhooks (data_request, redact, shop/redact) + HMAC handlers
- API version pinned 2026-04, scopes read_orders/read_products
- Fly deploy config; two-env strategy (custom now, public later)
- Dev setup: shopify.web.toml + Vite allowedHosts for tunnels
- Docs: PLAN.md, ANALISI-REQUISITI-LEGALI.md (Art. 54-bis compliance)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Mv83a29B4eFv5ixoj6PoE1
This commit is contained in:
2026-07-06 18:02:17 +02:00
commit 4586b2e557
62 changed files with 2968 additions and 0 deletions

18
app/.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
on: [push, pull_request]
name: CI
jobs:
CI:
name: CI_Node_${{ matrix.version }}
runs-on: ubuntu-latest
strategy:
matrix:
version: [20.19.0, 22, 24]
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: ${{ matrix.version }}
- name: Install
run: yarn install

22
app/.github/workflows/cla.yml vendored Normal file
View File

@@ -0,0 +1,22 @@
name: Contributor License Agreement (CLA)
on:
pull_request_target:
types: [opened, synchronize]
issue_comment:
types: [created]
jobs:
cla:
runs-on: ubuntu-latest
if: |
(github.event.issue.pull_request
&& !github.event.issue.pull_request.merged_at
&& contains(github.event.comment.body, 'signed')
)
|| (github.event.pull_request && !github.event.pull_request.merged)
steps:
- uses: Shopify/shopify-cla-action@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
cla-token: ${{ secrets.CLA_TOKEN }}

View File

@@ -0,0 +1,20 @@
name: Close Waiting for Response Issues
on:
schedule:
- cron: "30 1 * * *"
workflow_dispatch:
jobs:
check-need-info:
runs-on: ubuntu-latest
steps:
- name: close-issues
uses: actions-cool/issues-helper@45d75b6cf72bf4f254be6230cb887ad002702491 # v3.6.3
with:
actions: "close-issues"
token: ${{ secrets.GITHUB_TOKEN }}
labels: "Waiting for Response"
inactive-day: 14
body: |
We are closing this issue because we did not hear back regarding additional details we needed to resolve this issue. If the issue persists and you are able to provide the missing clarification we need, you can respond here or create a new issue.
We appreciate your understanding as we try to manage our number of open issues.

99
app/.github/workflows/convert-to-js.yml vendored Normal file
View File

@@ -0,0 +1,99 @@
name: Create Javascript conversion PR
on:
push:
branches:
- main
workflow_dispatch:
jobs:
convert-ts-files:
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
- name: Create lock file
run: touch yarn.lock
- name: Setup Node.js
uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: 22.12.x
cache: 'yarn'
- name: Install dependencies
run: yarn add -W --dev @shopify/eslint-plugin --ignore-engines
- name: Create temporary tsconfig file
run: |
echo '{
"include": ["./app/**/*", "*.ts", "*.tsx", ".graphqlrc.ts"],
"compilerOptions": {
"strict": true,
"removeComments": false,
"skipLibCheck": true,
"isolatedModules": true,
"noEmitOnError": true,
"jsx": "preserve",
"module": "ES2022",
"moduleResolution": "bundler",
"target": "ES2022",
"paths": {
"~/*": ["./app/*"]
}
}
}' > tsconfig.js.json
- name: Transpile to Javascript
run: yarn tsc -p tsconfig.js.json
- name: Remove Typescript files
run: |
find app \( -name "*.ts" -o -name "*.tsx" \) -delete
find . \( -name ".graphqlrc.ts" -o -name "tsconfig.js.json" -o -name "vite.config.ts" \) -delete
- name: Run prettier
run: yarn prettier -w "app/**/*.{js,jsx}" ".graphqlrc.js" "vite.config.js"
- name: Run ESLint
run: |
yarn lint "app/**/*.{js,jsx}" ".graphqlrc.js" "vite.config.js" --fix --no-cache --ignore-pattern "\!.graphqlrc.js" --plugin @shopify/eslint-plugin --rule '{
"import/order": "error",
"import/newline-after-import": "error",
"padding-line-between-statements": ["error",
{ "blankLine": "always", "prev": ["const", "let", "var"], "next": "*"},
{ "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"]}
{ "blankLine": "always", "prev": "*", "next": "return" },
{ "blankLine": "always", "prev": "*", "next": "export" },
{ "blankLine": "never", "prev": "export", "next": "export" },
{ "blankLine": "always", "prev": "*", "next": "block-like" },
{ "blankLine": "always", "prev": "block-like", "next": "*" }
]}'
- name: Prepare files for git
run: |
git config user.name GitHub
git config user.email noreply@github.com
git fetch
git restore --staged package.json
git restore package.json
- name: Stage changes to files
run: |
git add .
git checkout -b temp_javascript_updates
git commit -m "Convert template to Javascript"
git checkout javascript
git pull
git checkout -
git rebase -m -X theirs javascript
git push -f origin temp_javascript_updates:javascript_updates
- name: Create Javascript PR
run: |
gh pr view --json mergedAt -q ".mergedAt" javascript_updates | grep -E "^$" || \
gh pr create -B javascript -H javascript_updates --title 'Convert template to Javascript' --body 'This is an automated PR that converts the latest changes from Typescript to Javascript'
env:
GH_TOKEN: ${{ github.token }}

View File

@@ -0,0 +1,15 @@
name: Remove Waiting Labels
on:
issue_comment:
types: [created]
workflow_dispatch:
jobs:
remove-labels-on-activity:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@ee0669bd1cc54295c223e0bb666b733df41de1c5 # v2.7.0
- uses: actions-ecosystem/action-remove-labels@2ce5d41b4b6aa8503e285553f75ed56e0a40bae0 # v1.2.0
if: contains(github.event.issue.labels.*.name, 'Waiting for Response')
with:
labels: |
Waiting for Response