Files
indiekit-endpoint-activitypub/views/activitypub-profile.njk
Ricardo 4827a98614 feat: Fedify feature completeness — collections, dispatchers, delivery hardening
Implement all missing Fedify features for full ActivityPub compliance:

- Liked, Featured, Featured Tags collection dispatchers with admin UIs
- Object dispatcher for Note/Article dereferencing at AP URIs
- Instance actor (Application type) for domain-level federation
- Handle aliases (.mapAlias) for profile URL and /@handle resolution
- Configurable actor type (Person/Service/Organization/Group)
- Dynamic NodeInfo version from @indiekit/indiekit package.json
- Context data propagation (handle + publication URL)
- ParallelMessageQueue wrapping RedisMessageQueue (5 workers)
- Collection sync (FEP-8fcf) and ordering keys on sendActivity
- Permanent failure handler stub (deferred to Fedify 2.0)
- Profile attachments (PropertyValue) and alsoKnownAs support
- Strip invalid "type":"as:Endpoints" from actor JSON (Fedify #576)
- Fix .mapAlias() return type ({identifier} not bare string)
- Remove .authorize() predicate (causes 401 loops without auth doc loader)
- Narrow content negotiation router to /nodeinfo/ only

22/22 compliance tests pass (Grade A+). Version 1.0.26.
2026-02-20 22:57:41 +01:00

87 lines
2.4 KiB
Plaintext

{% extends "document.njk" %}
{% from "heading/macro.njk" import heading with context %}
{% from "input/macro.njk" import input with context %}
{% from "textarea/macro.njk" import textarea with context %}
{% from "checkboxes/macro.njk" import checkboxes with context %}
{% from "button/macro.njk" import button with context %}
{% from "notification-banner/macro.njk" import notificationBanner with context %}
{% from "prose/macro.njk" import prose with context %}
{% block content %}
{{ heading({ text: title, level: 1, parent: { text: __("activitypub.title"), href: mountPath } }) }}
{% if result %}
{{ notificationBanner({ type: result.type, text: result.text }) }}
{% endif %}
{{ prose({ text: __("activitypub.profile.intro") }) }}
<form method="post" novalidate>
{{ input({
name: "name",
label: __("activitypub.profile.nameLabel"),
hint: __("activitypub.profile.nameHint"),
value: profile.name
}) }}
{{ textarea({
name: "summary",
label: __("activitypub.profile.summaryLabel"),
hint: __("activitypub.profile.summaryHint"),
value: profile.summary,
rows: 4
}) }}
{{ input({
name: "url",
label: __("activitypub.profile.urlLabel"),
hint: __("activitypub.profile.urlHint"),
value: profile.url,
type: "url"
}) }}
{{ input({
name: "icon",
label: __("activitypub.profile.iconLabel"),
hint: __("activitypub.profile.iconHint"),
value: profile.icon,
type: "url"
}) }}
{{ input({
name: "image",
label: __("activitypub.profile.imageLabel"),
hint: __("activitypub.profile.imageHint"),
value: profile.image,
type: "url"
}) }}
{{ checkboxes({
name: "manuallyApprovesFollowers",
items: [
{
label: __("activitypub.profile.manualApprovalLabel"),
value: "true",
hint: __("activitypub.profile.manualApprovalHint")
}
],
values: ["true"] if profile.manuallyApprovesFollowers else []
}) }}
{{ checkboxes({
name: "authorizedFetch",
items: [
{
label: __("activitypub.profile.authorizedFetchLabel"),
value: "true",
hint: __("activitypub.profile.authorizedFetchHint")
}
],
values: ["true"] if profile.authorizedFetch else []
}) }}
{{ button({ text: __("activitypub.profile.save") }) }}
</form>
{% endblock %}