Skip to content

Fix magic link URL path to match router definition#8

Merged
ddon merged 1 commit into
BeamLabEU:devfrom
timujinne:dev
Sep 3, 2025
Merged

Fix magic link URL path to match router definition#8
ddon merged 1 commit into
BeamLabEU:devfrom
timujinne:dev

Conversation

@timujinne
Copy link
Copy Markdown
Contributor

  • Update magic_link_url/2 to generate /phoenix_kit/users/magic-link/ paths
  • Fix documentation examples to reflect correct URL structure
  • Add in CHANGELOG info about version change

- Update magic_link_url/2 to generate /phoenix_kit/users/magic-link/ paths
- Fix documentation examples to reflect correct URL structure
- Ensure generated URLs match route definition in integration.ex
@ddon ddon merged commit 23427d8 into BeamLabEU:dev Sep 3, 2025
ddon pushed a commit that referenced this pull request Nov 12, 2025
…idation-011CV2T76if2ffqakok4soSv

Add template variable validation to render_template function
ddon pushed a commit that referenced this pull request Nov 12, 2025
This merge brings in the latest changes from dev (V16-V21 migrations) and adds V22 migration with additional email system improvements.

## What's New in V22

### Database Schema Enhancements
- Add aws_message_id field to phoenix_kit_email_logs (nullable, unique when present)
- Add bounced_at, complained_at, opened_at, clicked_at timestamps to email_logs
- Add partial unique index on aws_message_id (WHERE aws_message_id IS NOT NULL)
- Add composite index (message_id, aws_message_id) for fast correlation
- Add composite index (email_log_id, event_type) for 10-100x faster duplicate checks

### New Tables
- phoenix_kit_email_orphaned_events - Track SQS events without matching logs
- phoenix_kit_email_metrics - Track system metrics (extraction rates, placeholder logs)

### Documentation
- Add comprehensive Message ID Strategy documentation in EmailLog module
- Explain dual ID system: message_id (internal) vs aws_message_id (provider)
- Document workflow and search priority for event correlation

## Changes from Dev Branch

The dev branch already includes many improvements that were originally planned:
- ✅ Duplicate event checks for ALL event types (PR #5)
- ✅ Template variable validation (PR #8)
- ✅ RateLimiter stub function implementations
- ✅ AWS message_id extraction improvements (PR #7)
- ✅ Placeholder email log handling (PR #6)

## Migration Path

Run `mix phoenix_kit.update` to apply V16-V22 migrations in sequence.

## Database Constraints

- message_id: UNIQUE NOT NULL (existing)
- aws_message_id: PARTIAL UNIQUE WHERE aws_message_id IS NOT NULL (new)
- Composite indexes for faster searches and event deduplication

## Backward Compatibility

All changes are backward compatible:
- Existing logs work with both message_id strategies
- New fields are nullable
- Indexes use create_if_not_exists for idempotency
mdon added a commit to mdon/phoenix_kit that referenced this pull request Mar 16, 2026
- Prevent publishing translations when primary language isn't published,
  fixing the contradiction between set_translation_status and
  fix_translation_status_consistency (BeamLabEU#8 from review)
- Remove dead should_regenerate_cache? and inline cache regeneration
- Fix 6 dialyzer warnings: redundant nil guards on values that are
  always strings or lists
- Use Constants for mode check in ListingCache.find_post_by_mode

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ddon pushed a commit that referenced this pull request May 12, 2026
20 findings across BUG / IMPROVEMENT / NITPICK. Tier 1 follow-ups
(OAuth state phantom activity, validate_credentials rescue) and Tier 2
(docstring drift, Permissions "db" precedence, V114 SQL guard, form
component migration). The trivial fixes (#2 doc rename, #3 rescue
narrow, #7 3-row test, #8 comment, #11 shadow, #14 disable-with)
are addressed in the preceding commit; remaining items are flagged
for a future sweep.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ddon pushed a commit that referenced this pull request May 12, 2026
Code (PR #537 review items addressed):

- #1 BUG-MEDIUM: wrap `Annotations.delete/1` in `Repo.transaction/1` so
  comment-cascade + annotation-delete are atomic. Extracted into
  `delete_in_transaction/1` to keep the body flat (credo depth).
- #2 BUG-MEDIUM: sweep stale `resource_type = "annotation"` claims
  across 3 moduledocs (annotation.ex, v115.ex, etcher_adapter.ex). The
  implementation anchors comments to the file with
  `metadata.annotation_uuid` — docs now match reality.
- #5 BUG-LOW: narrow `delete_linked_comments` rescue to expected
  exception classes ([DBConnection.OwnershipError, Postgrex.Error,
  ArgumentError]) so logic bugs surface instead of being swallowed.
- #11 IMPROVEMENT-LOW: drop `normalize/1` — `Ecto.Changeset.cast/3`
  handles both atom- and string-keyed maps natively; the helper added
  silent failure-mode risk on typo'd keys.
- #12 IMPROVEMENT-LOW: drop in-repo `Code.ensure_loaded?(PhoenixKit.Annotations)`
  guard in MediaBrowser — Annotations is a core module, can't be
  missing.
- #19 NITPICK: drop `PhoenixKit.Modules.Storage` from
  AnnotationComposer's `@compile no_warn_undefined` (it's core, not
  optional — rename should fail loudly).
- #20 NITPICK: simplify `AnnotationComposerPosition.destroyed` guard.
- #21 NITPICK: fix misleading "Etcher's bootstrap uses `||` to preserve
  pre-existing slots" comment — PhoenixKit's JS owns the slots.
- #8 IMPROVEMENT-MEDIUM: gettext-wrap ~17 user-facing strings in
  AnnotationComposer (flash messages + heex literals + ARIA labels).

Credo / dialyzer:
- Alias `PhoenixKit.Annotations`, `PhoenixKit.Modules.Storage`,
  `PhoenixKit.Modules.Storage.EtcherAdapter`, `Storage.File` so the
  six "nested modules could be aliased" findings clear.
- Convert `first_attachment_thumbnail/1`'s single-clause `with` to
  `case` (credo readability).
- Add PhoenixKitComments-targeted entries to .dialyzer_ignore.exs for
  the annotations context + composer (optional sibling package,
  guarded at runtime).
- mix.lock picks up `etcher 0.1.0` via deps.get.

mix precommit: compile → format → credo --strict → dialyzer all clean.
Deferred to original author (Alex): #3 (race), #4 (upload rollback),
#6 (authz), #7 (schema-as-source), #9 (geometry validation), #10
(configurable component id), #13/#14 (locale-aware date + traverse_errors),
plus cosmetics #15-18, #22, #23. Disposition table in CLAUDE_REVIEW.md
updated separately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.

2 participants