MishkaBlog.PostTag (Mishka Blog v0.0.1)

Copy Markdown View Source

Manages the many-to-many relationship between blog posts and tags with full version control.

This resource serves as the join table that associates blog posts with tags, enabling posts to have multiple tags and tags to categorize multiple posts. Each record represents a tag assignment, indicating that a post is tagged with a specific tag for content organization and discovery.

The resource implements upsert functionality through the assign action, preventing duplicate post-tag assignments while allowing efficient bulk updates. The unique constraint on post_id and tag_id pairs ensures that each post can only be assigned a specific tag once, maintaining data integrity.

Post-tag associations are tracked through PaperTrail integration, recording when tags are added to or removed from posts. This provides a complete audit trail for content organization changes, essential for editorial workflows and taxonomy management.

Access to this resource is controlled through policies that allow manipulation either through the BlogPost or Tag resource relationships or by users with administrative privileges. This ensures that tag assignments can only be modified by authorized actors.

Summary

Functions

Validates that the keys in the provided input are valid for at least one action on the resource.

Same as input/1, except restricts the keys to values accepted by the action provided.

Types

t()

@type t() :: %MishkaBlog.PostTag{
  __lateral_join_source__: term(),
  __meta__: term(),
  __metadata__: term(),
  __order__: term(),
  aggregates: term(),
  calculations: term(),
  inserted_at: term(),
  post: term(),
  post_id: term(),
  post_in_any_state: term(),
  tag: term(),
  tag_id: term(),
  updated_at: term()
}

Functions

default_short_name()

input(opts)

@spec input(values :: map() | Keyword.t()) :: map() | no_return()

Validates that the keys in the provided input are valid for at least one action on the resource.

Raises a KeyError error at compile time if not. This exists because generally a struct should only ever be created by Ash as a result of a successful action. You should not be creating records manually in code, e.g %MyResource{value: 1, value: 2}. Generally that is fine, but often with embedded resources it is nice to be able to validate the keys that are being provided, e.g

Resource
|> Ash.Changeset.for_create(:create, %{embedded: EmbeddedResource.input(foo: 1, bar: 2)})
|> Ash.create()

input(opts, action)

@spec input(values :: map() | Keyword.t(), action :: atom()) :: map() | no_return()

Same as input/1, except restricts the keys to values accepted by the action provided.

primary_key_matches?(left, right)