Manages user votes (upvote/downvote) on comments.
This resource represents votes that users cast on comments to indicate helpfulness or agreement. Each vote links a user to a specific comment with either an upvote or downvote.
The unique constraint on user_id and comment_id ensures each user can only vote
once per comment. Users change their vote type (from up to down or vice versa) by voting
again: both create actions write over the user's existing vote on that comment. This resource
has no multitenancy of its own, so a vote may only name a comment of the site it is made for
(MishkaCmsCore.Runtime.Resources.Validations.TenantIsolation), and the user it names is a user
of that comment's site or a master, whoever writes it
(MishkaCmsCore.Runtime.Resources.Validations.SameSiteReference).
Database-level constraints ensure data integrity with cascade deletes when comments or users are removed, and provide efficient querying for vote counts and user voting history.
Summary
Functions
Apply the full GuardedStruct pipeline (sanitize → validate → derive →
main_validator) to attrs and return either {:ok, transformed_attrs}
or {:error, errors}. Wire this into an Ash.Resource.Change to plug
guardedstruct rules into Ash's changeset pipeline.
O(1) lookup of a field's compile-time metadata by name. Returns
nil for unknown fields.
Compile-time-baked MapSet of every field name owned by the
guardedstruct block. Used by GuardedStruct.AshResource.Change
to decide, in O(1), whether a key in changeset.atomics
belongs to the pipeline.
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
@type t() :: %MishkaBlog.CommentVote{ __lateral_join_source__: term(), __meta__: term(), __metadata__: term(), __order__: term(), aggregates: term(), calculations: term(), comment: term(), comment_id: term(), comment_in_any_state: term(), id: term(), inserted_at: term(), updated_at: term(), user: term(), user_id: term(), vote_type: term() }
Functions
Apply the full GuardedStruct pipeline (sanitize → validate → derive →
main_validator) to attrs and return either {:ok, transformed_attrs}
or {:error, errors}. Wire this into an Ash.Resource.Change to plug
guardedstruct rules into Ash's changeset pipeline.
The function is named __guarded_change__ because it does more than
validate — it can also transform values (trim, downcase, slugify,
auto-fill, etc.) before they reach the data layer.
O(1) lookup of a field's compile-time metadata by name. Returns
nil for unknown fields.
Compile-time-baked MapSet of every field name owned by the
guardedstruct block. Used by GuardedStruct.AshResource.Change
to decide, in O(1), whether a key in changeset.atomics
belongs to the pipeline.
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()
Same as input/1, except restricts the keys to values accepted by the action provided.