Skip to content

feat: profile fields on /register (@profullstack/profile) - #108

Merged
ralyodio merged 1 commit into
masterfrom
feat/profile-fields
Oct 26, 2026
Merged

ralyodio merged 1 commit into
masterfrom
feat/profile-fields

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Adopts the shared @profullstack/profile (0.1.3, exact) on smshub.dev.

  • /register: ProfileFields for first/last name (required), company domain, job title, LinkedIn (optional), styled like the existing inputs.
  • POST /api/auth/signup-profile: server-side validateProfile before the client supabase.auth.signUp; after signUp it stores the fields for the new account only if it is unconfirmed, created < 15 min ago, same address, and has no profile yet. Stand-in users (identities: [], existing address) are skipped.
  • signUp options.data carries the normalized fields; /auth/callback saves them if there is still no profile row (never blocks sign-in).
  • API: GET/PUT/PATCH /api/v1/me/profile; /settings gets a Profile card (GET prefill, PATCH save).
  • Schema: supabase/migrations/016_user_profiles.sql, the package's own table keyed by auth user id, RLS on with no anon/authenticated policies. Applied by hand to dev2 smshub-dev-supabase-db. contacts.company (CRM data) untouched. No backfill (no account-holder name column).
  • Test: src/app/api/__tests__/signup-profile.test.ts. typecheck, lint, 306 tests pass.

🤖 Generated with Claude Code

/register now asks for first and last name (required) plus company domain,
job title and LinkedIn (optional) with the shared @profullstack/profile
0.1.3 component. POST /api/auth/signup-profile validates them on the server
before supabase.auth.signUp, then stores them for the new, still unconfirmed
account (same address, created in the last 15 minutes, no profile yet). The
fields also ride in signUp user metadata and are saved on /auth/callback if
that call never lands. GET/PUT/PATCH /api/v1/me/profile plus a Profile card
on /settings.

Stored in a new server-only user_profiles table (RLS on, no anon or
authenticated policies). contacts.company is CRM data and is untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

12 finding(s)

HIGH/CRITICAL: 2 | MEDIUM: 4 | LOW: 6

Severity Rule Location
HIGH sh-unquoted-expansion-destructive public/install.sh:67
HIGH sh-remote-script-execution public/install.sh:89
MEDIUM sh-remote-script-execution public/install.sh:133
MEDIUM js-open-redirect src/app/numbers/page.tsx:178
MEDIUM js-open-redirect src/components/inbox-client.tsx:35
MEDIUM js-unescaped-html-sink src/components/pit-footer.tsx:17
LOW secret-generic-credential src/lib/providers/__tests__/twilio.test.ts:24
LOW secret-generic-credential src/lib/providers/__tests__/twilio.test.ts:46
LOW secret-generic-credential src/lib/providers/__tests__/twilio.test.ts:60
LOW secret-generic-credential src/lib/providers/__tests__/twilio.test.ts:78
LOW secret-generic-credential supabase/config.toml:287
LOW secret-generic-credential supabase/config.toml:319

Snippets are redacted; ThreatCrush never prints matched credential material.

@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​profullstack/​profile@​0.1.37610010091100

View full report

@ralyodio
ralyodio merged commit d9afb4b into master Oct 26, 2026
11 of 12 checks passed
@ralyodio
ralyodio deleted the feat/profile-fields branch October 26, 2026 10:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant