# retoor <retoor@molodetz.nl>
from __future__ import annotations
from ..spec import Action
from ._shared import TARGET_TYPE, body, path, query
ENGAGEMENT_ACTIONS: tuple[Action, ...] = (
Action(
name="vote",
method="POST",
path="/votes/{target_type}/{target_uid}",
summary="Cast or toggle a vote on a target",
description="Re-sending the same value removes the vote. Returns the net/up/down tally.",
ajax=True,
params=(
path("target_type", TARGET_TYPE),
path(
"target_uid",
"Uid of the target, copied from a listing response; do not invent it.",
),
body(
"value",
"Vote value: 1 to upvote, -1 to downvote (re-send to remove).",
required=True,
),
),
),
Action(
name="react",
method="POST",
path="/reactions/{target_type}/{target_uid}",
summary="Toggle an emoji reaction on a target",
description="Re-sending the same emoji removes it. Returns reaction counts.",
ajax=True,
params=(
path("target_type", TARGET_TYPE),
path(
"target_uid",
"Uid of the target, copied from a listing response; do not invent it.",
),
body("emoji", "One of the allowed reaction emoji.", required=True),
),
),
Action(
name="list_bookmarks",
method="GET",
path="/bookmarks/saved",
summary="List saved bookmarks",
params=(query("before", "Pagination cursor."),),
),
Action(
name="toggle_bookmark",
method="POST",
path="/bookmarks/{target_type}/{target_uid}",
summary="Toggle a bookmark on a target",
description="Re-sending removes the bookmark. Returns {saved: true|false}.",
ajax=True,
params=(
path("target_type", TARGET_TYPE),
path(
"target_uid",
"Uid of the target, copied from a listing response; do not invent it.",
),
),
),
Action(
name="vote_poll",
method="POST",
path="/polls/{poll_uid}/vote",
summary="Vote in a poll",
description="Casts or changes your vote on a poll option. Returns the option tallies.",
ajax=True,
params=(
path("poll_uid", "Poll uid."),
body("option_uid", "Chosen option uid.", required=True),
),
),
)