diff --git a/api/org_tangled/serveraddMember.go b/api/org_tangled/serveraddMember.go new file mode 100644 index 000000000..35293f25d --- /dev/null +++ b/api/org_tangled/serveraddMember.go @@ -0,0 +1,30 @@ +// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. + +package org_tangled + +// schema: org.tangled.temp.server.addMember + +import ( + "context" + + "github.com/bluesky-social/indigo/lex/util" +) + +const ( + TempServerAddMemberNSID = "org.tangled.temp.server.addMember" +) + +// TempServerAddMember_Input is the input argument to a org.tangled.temp.server.addMember call. +type TempServerAddMember_Input struct { + // subject: DID of the member to add + Subject string `json:"subject" cborgen:"subject"` +} + +// TempServerAddMember calls the XRPC method "org.tangled.temp.server.addMember". +func TempServerAddMember(ctx context.Context, c util.LexClient, input *TempServerAddMember_Input) error { + if err := c.LexDo(ctx, util.Procedure, "application/json", "org.tangled.temp.server.addMember", nil, input, nil); err != nil { + return err + } + + return nil +} diff --git a/api/org_tangled/serverbanUser.go b/api/org_tangled/serverbanUser.go new file mode 100644 index 000000000..c600e3fed --- /dev/null +++ b/api/org_tangled/serverbanUser.go @@ -0,0 +1,30 @@ +// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. + +package org_tangled + +// schema: org.tangled.temp.server.banUser + +import ( + "context" + + "github.com/bluesky-social/indigo/lex/util" +) + +const ( + TempServerBanUserNSID = "org.tangled.temp.server.banUser" +) + +// TempServerBanUser_Input is the input argument to a org.tangled.temp.server.banUser call. +type TempServerBanUser_Input struct { + // subject: DID of the account to ban + Subject string `json:"subject" cborgen:"subject"` +} + +// TempServerBanUser calls the XRPC method "org.tangled.temp.server.banUser". +func TempServerBanUser(ctx context.Context, c util.LexClient, input *TempServerBanUser_Input) error { + if err := c.LexDo(ctx, util.Procedure, "application/json", "org.tangled.temp.server.banUser", nil, input, nil); err != nil { + return err + } + + return nil +} diff --git a/api/org_tangled/serverremoveMember.go b/api/org_tangled/serverremoveMember.go new file mode 100644 index 000000000..c618215ef --- /dev/null +++ b/api/org_tangled/serverremoveMember.go @@ -0,0 +1,30 @@ +// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. + +package org_tangled + +// schema: org.tangled.temp.server.removeMember + +import ( + "context" + + "github.com/bluesky-social/indigo/lex/util" +) + +const ( + TempServerRemoveMemberNSID = "org.tangled.temp.server.removeMember" +) + +// TempServerRemoveMember_Input is the input argument to a org.tangled.temp.server.removeMember call. +type TempServerRemoveMember_Input struct { + // subject: DID of the member to remove + Subject string `json:"subject" cborgen:"subject"` +} + +// TempServerRemoveMember calls the XRPC method "org.tangled.temp.server.removeMember". +func TempServerRemoveMember(ctx context.Context, c util.LexClient, input *TempServerRemoveMember_Input) error { + if err := c.LexDo(ctx, util.Procedure, "application/json", "org.tangled.temp.server.removeMember", nil, input, nil); err != nil { + return err + } + + return nil +} diff --git a/api/org_tangled/serverunbanUser.go b/api/org_tangled/serverunbanUser.go new file mode 100644 index 000000000..cdf2084da --- /dev/null +++ b/api/org_tangled/serverunbanUser.go @@ -0,0 +1,30 @@ +// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. + +package org_tangled + +// schema: org.tangled.temp.server.unbanUser + +import ( + "context" + + "github.com/bluesky-social/indigo/lex/util" +) + +const ( + TempServerUnbanUserNSID = "org.tangled.temp.server.unbanUser" +) + +// TempServerUnbanUser_Input is the input argument to a org.tangled.temp.server.unbanUser call. +type TempServerUnbanUser_Input struct { + // subject: DID of the account to unban + Subject string `json:"subject" cborgen:"subject"` +} + +// TempServerUnbanUser calls the XRPC method "org.tangled.temp.server.unbanUser". +func TempServerUnbanUser(ctx context.Context, c util.LexClient, input *TempServerUnbanUser_Input) error { + if err := c.LexDo(ctx, util.Procedure, "application/json", "org.tangled.temp.server.unbanUser", nil, input, nil); err != nil { + return err + } + + return nil +} diff --git a/api/tangled/knotlistMemberInvites.go b/api/tangled/knotlistMemberInvites.go deleted file mode 100644 index bd498efd4..000000000 --- a/api/tangled/knotlistMemberInvites.go +++ /dev/null @@ -1,59 +0,0 @@ -// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. - -package tangled - -// schema: sh.tangled.knot.listMemberInvites - -import ( - "context" - - "github.com/bluesky-social/indigo/lex/util" -) - -const ( - KnotListMemberInvitesNSID = "sh.tangled.knot.listMemberInvites" -) - -// KnotListMemberInvites_InviteItem is a "inviteItem" in the sh.tangled.knot.listMemberInvites schema. -// -// An offer awaiting the subject's acceptance. effectiveSince and access both arrive once the acceptance resolves. -type KnotListMemberInvites_InviteItem struct { - // addedBy: DID that made the offer - AddedBy string `json:"addedBy" cborgen:"addedBy"` - // createdAt: When the knot made the offer. This listing sorts and pages on it. - CreatedAt string `json:"createdAt" cborgen:"createdAt"` - // subject: DID the knot offered membership to - Subject string `json:"subject" cborgen:"subject"` -} - -// KnotListMemberInvites_Output is the output of a sh.tangled.knot.listMemberInvites call. -type KnotListMemberInvites_Output struct { - Cursor *string `json:"cursor,omitempty" cborgen:"cursor,omitempty"` - Items []*KnotListMemberInvites_InviteItem `json:"items" cborgen:"items"` -} - -// KnotListMemberInvites calls the XRPC method "sh.tangled.knot.listMemberInvites". -// -// cursor: Pagination cursor -// order: Sort direction by createdAt. -// subject: Knot identifier whose outstanding membership offers to list. -func KnotListMemberInvites(ctx context.Context, c util.LexClient, cursor string, limit int64, order string, subject string) (*KnotListMemberInvites_Output, error) { - var out KnotListMemberInvites_Output - - params := map[string]interface{}{} - if cursor != "" { - params["cursor"] = cursor - } - if limit != 0 { - params["limit"] = limit - } - if order != "" { - params["order"] = order - } - params["subject"] = subject - if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.listMemberInvites", params, nil, &out); err != nil { - return nil, err - } - - return &out, nil -} diff --git a/api/tangled/knotlistMemberInvitesBy.go b/api/tangled/knotlistMemberInvitesBy.go deleted file mode 100644 index ce862a66c..000000000 --- a/api/tangled/knotlistMemberInvitesBy.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. - -package tangled - -// schema: sh.tangled.knot.listMemberInvitesBy - -import ( - "context" - - "github.com/bluesky-social/indigo/lex/util" -) - -const ( - KnotListMemberInvitesByNSID = "sh.tangled.knot.listMemberInvitesBy" -) - -// KnotListMemberInvitesBy_InviteItem is a "inviteItem" in the sh.tangled.knot.listMemberInvitesBy schema. -// -// Offer awaiting the subject's acceptance. -type KnotListMemberInvitesBy_InviteItem struct { - // addedBy: DID that made the offer. - AddedBy string `json:"addedBy" cborgen:"addedBy"` - // createdAt: When the knot made the offer. This listing sorts on it by newest first. - CreatedAt string `json:"createdAt" cborgen:"createdAt"` - // knot: did:web of knot that made this offer. Check against pending. - Knot string `json:"knot" cborgen:"knot"` - // uri: Invite record on knot's repo. - Uri string `json:"uri" cborgen:"uri"` -} - -// KnotListMemberInvitesBy_Output is the output of a sh.tangled.knot.listMemberInvitesBy call. -type KnotListMemberInvitesBy_Output struct { - Items []*KnotListMemberInvitesBy_InviteItem `json:"items" cborgen:"items"` - // pending: The knots that this indexation hasn't yet read. - Pending []string `json:"pending" cborgen:"pending"` - // truncated: Per-subject cut dropped offers from items. If truncated is true, missing offers won't advertise that they were withdrawn, same as with pending knots. - Truncated bool `json:"truncated" cborgen:"truncated"` -} - -// KnotListMemberInvitesBy calls the XRPC method "sh.tangled.knot.listMemberInvitesBy". -// -// subject: Actor DID offered membership. -func KnotListMemberInvitesBy(ctx context.Context, c util.LexClient, subject string) (*KnotListMemberInvitesBy_Output, error) { - var out KnotListMemberInvitesBy_Output - - params := map[string]interface{}{} - params["subject"] = subject - if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.listMemberInvitesBy", params, nil, &out); err != nil { - return nil, err - } - - return &out, nil -} diff --git a/api/tangled/knotlistMembers.go b/api/tangled/knotlistMembers.go index 33624ffd1..9395241e2 100644 --- a/api/tangled/knotlistMembers.go +++ b/api/tangled/knotlistMembers.go @@ -20,16 +20,12 @@ type KnotListMembers_ListItem struct { AddedBy string `json:"addedBy" cborgen:"addedBy"` // cid: Optional record CID for record-backed indexers Cid *string `json:"cid,omitempty" cborgen:"cid,omitempty"` - // createdAt: When the knot offered membership + // createdAt: When the member was added. This listing sorts and pages on it. CreatedAt string `json:"createdAt" cborgen:"createdAt"` - // effectiveSince: When the membership took effect. This listing sorts and pages on it. - EffectiveSince string `json:"effectiveSince" cborgen:"effectiveSince"` // subject: DID of the member Subject string `json:"subject" cborgen:"subject"` // uri: Optional record AT-URI for record-backed indexers Uri *string `json:"uri,omitempty" cborgen:"uri,omitempty"` - // verifiedAt: When the knot resolved the member's own acceptance record. Absent on a grant that predates the consent model. - VerifiedAt *string `json:"verifiedAt,omitempty" cborgen:"verifiedAt,omitempty"` } // KnotListMembers_Output is the output of a sh.tangled.knot.listMembers call. @@ -44,7 +40,7 @@ type KnotListMembers_Output struct { // // cursor: Pagination cursor // offset: Absolute offset for random-access pagination. Mutually exclusive with cursor; offsets drift under concurrent writes, so follow up with the returned cursor. -// order: Sort direction by effectiveSince. +// order: Sort direction by createdAt. // subject: Knot identifier whose member records to list. func KnotListMembers(ctx context.Context, c util.LexClient, cursor string, limit int64, offset int64, order string, subject string) (*KnotListMembers_Output, error) { var out KnotListMembers_Output diff --git a/api/tangled/knotlistMembersBy.go b/api/tangled/knotlistMembersBy.go deleted file mode 100644 index 0f50e8030..000000000 --- a/api/tangled/knotlistMembersBy.go +++ /dev/null @@ -1,53 +0,0 @@ -// Code generated by cmd/lexgen (see Makefile's lexgen); DO NOT EDIT. - -package tangled - -// schema: sh.tangled.knot.listMembersBy - -import ( - "context" - - "github.com/bluesky-social/indigo/lex/util" -) - -const ( - KnotListMembersByNSID = "sh.tangled.knot.listMembersBy" -) - -// KnotListMembersBy_Output is the output of a sh.tangled.knot.listMembersBy call. -type KnotListMembersBy_Output struct { - Cursor *string `json:"cursor,omitempty" cborgen:"cursor,omitempty"` - Items []*KnotListMembers_ListItem `json:"items" cborgen:"items"` - // total: Total items in the full list; omitted for filtered or merged views - Total *int64 `json:"total,omitempty" cborgen:"total,omitempty"` -} - -// KnotListMembersBy calls the XRPC method "sh.tangled.knot.listMembersBy". -// -// cursor: Pagination cursor -// offset: Absolute offset for random-access pagination. Mutually exclusive with cursor; offsets drift under concurrent writes, so follow up with the returned cursor. -// order: Sort direction by createdAt. -// subject: Actor DID whose knot-member authorings to list. -func KnotListMembersBy(ctx context.Context, c util.LexClient, cursor string, limit int64, offset int64, order string, subject string) (*KnotListMembersBy_Output, error) { - var out KnotListMembersBy_Output - - params := map[string]interface{}{} - if cursor != "" { - params["cursor"] = cursor - } - if limit != 0 { - params["limit"] = limit - } - if offset != 0 { - params["offset"] = offset - } - if order != "" { - params["order"] = order - } - params["subject"] = subject - if err := c.LexDo(ctx, util.Query, "", "sh.tangled.knot.listMembersBy", params, nil, &out); err != nil { - return nil, err - } - - return &out, nil -} diff --git a/api/tangled/knotmember.go b/api/tangled/knotmember.go index a65d83732..c14e78372 100644 --- a/api/tangled/knotmember.go +++ b/api/tangled/knotmember.go @@ -15,7 +15,7 @@ const ( func init() { util.RegisterType("sh.tangled.knot.member", &KnotMember{}) } // -// DEPRECATED: use sh.tangled.knot.memberInvite plus sh.tangled.knot.memberAcceptance instead. Existing records keep their meaning and this NSID is never reused, so indexers shouldn't migrate what they have already stored. +// DEPRECATED: knot member list is not published any more. // // RECORDTYPE: KnotMember type KnotMember struct { diff --git a/docker-compose.yml b/docker-compose.yml index 21392a726..1f92b769d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -618,7 +618,7 @@ services: HYDRANT_CRAWLER_URLS: list_repos::https://pds.tngl.boltless.dev HYDRANT_PLC_URL: https://plc.tngl.boltless.dev HYDRANT_FILTER_COLLECTIONS: sh.tangled.*,org.tangled.* - HYDRANT_FILTER_SIGNALS: sh.tangled.actor.profile,sh.tangled.feed.comment,sh.tangled.feed.reaction,sh.tangled.feed.star,sh.tangled.git.refUpdate,sh.tangled.graph.follow,sh.tangled.graph.vouch,sh.tangled.knot,sh.tangled.knot.member,sh.tangled.knot.memberAcceptance,sh.tangled.knot.memberInvite,sh.tangled.label.definition,sh.tangled.label.op,sh.tangled.pipeline,sh.tangled.pipeline.status,sh.tangled.publicKey,sh.tangled.repo,sh.tangled.repo.artifact,sh.tangled.repo.collaborator,sh.tangled.repo.collaboratorAcceptance,sh.tangled.repo.collaboratorInvite,sh.tangled.repo.issue,sh.tangled.repo.issue.comment,sh.tangled.repo.issue.state,sh.tangled.repo.pull,sh.tangled.repo.pull.comment,sh.tangled.repo.pull.status,sh.tangled.spindle,sh.tangled.spindle.member,sh.tangled.string,org.tangled.feed.subscription + HYDRANT_FILTER_SIGNALS: sh.tangled.actor.profile,sh.tangled.feed.comment,sh.tangled.feed.reaction,sh.tangled.feed.star,sh.tangled.git.refUpdate,sh.tangled.graph.follow,sh.tangled.graph.vouch,sh.tangled.knot,sh.tangled.knot.member,sh.tangled.knot.memberInvite,sh.tangled.label.definition,sh.tangled.label.op,sh.tangled.pipeline,sh.tangled.pipeline.status,sh.tangled.publicKey,sh.tangled.repo,sh.tangled.repo.artifact,sh.tangled.repo.collaborator,sh.tangled.repo.collaboratorAcceptance,sh.tangled.repo.collaboratorInvite,sh.tangled.repo.issue,sh.tangled.repo.issue.comment,sh.tangled.repo.issue.state,sh.tangled.repo.pull,sh.tangled.repo.pull.comment,sh.tangled.repo.pull.status,sh.tangled.spindle,sh.tangled.spindle.member,sh.tangled.string,org.tangled.feed.subscription HYDRANT_BACKFILL_STRATEGY: sparse-filter HYDRANT_VERIFY_SIGNATURES: none RUST_LOG: info diff --git a/lexicons/knot/listMemberInvites.json b/lexicons/knot/listMemberInvites.json deleted file mode 100644 index f0295383b..000000000 --- a/lexicons/knot/listMemberInvites.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "lexicon": 1, - "id": "sh.tangled.knot.listMemberInvites", - "defs": { - "main": { - "type": "query", - "description": "List this knot's outstanding membership offers. An offer leaves this listing once acceptMembership resolves the subject's record, or removeMember withdraws it.", - "parameters": { - "type": "params", - "required": ["subject"], - "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "Knot identifier whose outstanding membership offers to list." - }, - "cursor": { "type": "string", "description": "Pagination cursor" }, - "limit": { - "type": "integer", - "minimum": 1, - "maximum": 1000, - "default": 50 - }, - "order": { - "type": "string", - "knownValues": ["asc", "desc"], - "default": "desc", - "description": "Sort direction by createdAt." - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["items"], - "properties": { - "items": { - "type": "array", - "items": { "type": "ref", "ref": "#inviteItem" } - }, - "cursor": { "type": "string" } - } - } - } - }, - "inviteItem": { - "type": "object", - "description": "An offer awaiting the subject's acceptance. effectiveSince and access both arrive once the acceptance resolves.", - "required": ["subject", "addedBy", "createdAt"], - "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "DID the knot offered membership to" - }, - "addedBy": { - "type": "string", - "format": "did", - "description": "DID that made the offer" - }, - "createdAt": { - "type": "string", - "format": "datetime", - "description": "When the knot made the offer. This listing sorts and pages on it." - } - } - } - } -} diff --git a/lexicons/knot/listMemberInvitesBy.json b/lexicons/knot/listMemberInvitesBy.json deleted file mode 100644 index 8ee24b529..000000000 --- a/lexicons/knot/listMemberInvitesBy.json +++ /dev/null @@ -1,70 +0,0 @@ -{ - "lexicon": 1, - "id": "sh.tangled.knot.listMemberInvitesBy", - "defs": { - "main": { - "type": "query", - "description": "Grabbing the membership offers that a given DID has lined up. The inverse of sh.tangled.knot.listMemberInvites.", - "parameters": { - "type": "params", - "required": ["subject"], - "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "Actor DID offered membership." - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["items", "pending", "truncated"], - "properties": { - "items": { - "type": "array", - "items": { "type": "ref", "ref": "#inviteItem" } - }, - "pending": { - "type": "array", - "description": "The knots that this indexation hasn't yet read.", - "items": { "type": "string", "format": "did" } - }, - "truncated": { - "type": "boolean", - "description": "Per-subject cut dropped offers from items. If truncated is true, missing offers won't advertise that they were withdrawn, same as with pending knots." - } - } - } - } - }, - "inviteItem": { - "type": "object", - "description": "Offer awaiting the subject's acceptance.", - "required": ["uri", "knot", "addedBy", "createdAt"], - "properties": { - "uri": { - "type": "string", - "format": "at-uri", - "description": "Invite record on knot's repo." - }, - "knot": { - "type": "string", - "format": "did", - "description": "did:web of knot that made this offer. Check against pending." - }, - "addedBy": { - "type": "string", - "format": "did", - "description": "DID that made the offer." - }, - "createdAt": { - "type": "string", - "format": "datetime", - "description": "When the knot made the offer. This listing sorts on it by newest first." - } - } - } - } -} diff --git a/lexicons/knot/listMembers.json b/lexicons/knot/listMembers.json index 38e6c1c5e..f7a5b50a4 100644 --- a/lexicons/knot/listMembers.json +++ b/lexicons/knot/listMembers.json @@ -31,7 +31,7 @@ "type": "string", "knownValues": ["asc", "desc"], "default": "desc", - "description": "Sort direction by effectiveSince." + "description": "Sort direction by createdAt." } } }, @@ -56,7 +56,7 @@ }, "listItem": { "type": "object", - "required": ["subject", "addedBy", "createdAt", "effectiveSince"], + "required": ["subject", "addedBy", "createdAt"], "properties": { "subject": { "type": "string", @@ -71,17 +71,7 @@ "createdAt": { "type": "string", "format": "datetime", - "description": "When the knot offered membership" - }, - "verifiedAt": { - "type": "string", - "format": "datetime", - "description": "When the knot resolved the member's own acceptance record. Absent on a grant that predates the consent model." - }, - "effectiveSince": { - "type": "string", - "format": "datetime", - "description": "When the membership took effect. This listing sorts and pages on it." + "description": "When the member was added. This listing sorts and pages on it." }, "uri": { "type": "string", diff --git a/lexicons/knot/listMembersBy.json b/lexicons/knot/listMembersBy.json deleted file mode 100644 index fe236ff56..000000000 --- a/lexicons/knot/listMembersBy.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "lexicon": 1, - "id": "sh.tangled.knot.listMembersBy", - "defs": { - "main": { - "type": "query", - "parameters": { - "type": "params", - "required": ["subject"], - "properties": { - "subject": { - "type": "string", - "format": "did", - "description": "Actor DID whose knot-member authorings to list." - }, - "cursor": { - "type": "string", - "description": "Pagination cursor" - }, - "offset": { - "type": "integer", - "minimum": 0, - "description": "Absolute offset for random-access pagination. Mutually exclusive with cursor; offsets drift under concurrent writes, so follow up with the returned cursor." - }, - "limit": { - "type": "integer", - "minimum": 1, - "maximum": 1000, - "default": 50 - }, - "order": { - "type": "string", - "knownValues": ["asc", "desc"], - "default": "desc", - "description": "Sort direction by createdAt." - } - } - }, - "output": { - "encoding": "application/json", - "schema": { - "type": "object", - "required": ["items"], - "properties": { - "items": { - "type": "array", - "items": { "type": "ref", "ref": "sh.tangled.knot.listMembers#listItem" } - }, - "cursor": { "type": "string" }, - "total": { - "type": "integer", - "description": "Total items in the full list; omitted for filtered or merged views" - } - } - } - } - } - } -} diff --git a/lexicons/knot/member.json b/lexicons/knot/member.json index 9a6dad04c..599aadf76 100644 --- a/lexicons/knot/member.json +++ b/lexicons/knot/member.json @@ -6,11 +6,11 @@ "defs": { "main": { "type": "record", - "description": "DEPRECATED: use sh.tangled.knot.memberInvite plus sh.tangled.knot.memberAcceptance instead. Existing records keep their meaning and this NSID is never reused, so indexers shouldn't migrate what they have already stored.", + "description": "DEPRECATED: knot member list is not published any more.", "key": "tid", "record": { "type": "object", - "description": "DEPRECATED: use sh.tangled.knot.memberInvite plus sh.tangled.knot.memberAcceptance instead. Existing records keep their meaning and this NSID is never reused, so indexers shouldn't migrate what they have already stored.", + "description": "DEPRECATED: knot member list is not published any more.", "required": [ "subject", "domain", diff --git a/lexicons/knot/acceptMembership.json b/lexicons/legacy/knot/acceptMembership.json similarity index 68% rename from lexicons/knot/acceptMembership.json rename to lexicons/legacy/knot/acceptMembership.json index 3a6183a20..f30be539e 100644 --- a/lexicons/knot/acceptMembership.json +++ b/lexicons/legacy/knot/acceptMembership.json @@ -4,7 +4,7 @@ "defs": { "main": { "type": "procedure", - "description": "Accept this knot's membership offer. The knot refuses the call unless the acceptance record is already in the actor's own repository.", + "description": "DEPRECATED: legacy consent flow for the old knotserver; knot2 grants membership on addMember alone. Accept this knot's membership offer. The knot refuses the call unless the acceptance record is already in the actor's own repository.", "input": { "encoding": "application/json", "schema": { diff --git a/lexicons/knot/memberAcceptance.json b/lexicons/legacy/knot/memberAcceptance.json similarity index 72% rename from lexicons/knot/memberAcceptance.json rename to lexicons/legacy/knot/memberAcceptance.json index 95153f473..bb90531a2 100644 --- a/lexicons/knot/memberAcceptance.json +++ b/lexicons/legacy/knot/memberAcceptance.json @@ -6,7 +6,7 @@ "defs": { "main": { "type": "record", - "description": "Acceptance of a knot's membership offer, w/ knot-DID as rkey", + "description": "DEPRECATED: legacy consent flow for the old knotserver; knot2 grants membership on addMember alone. Acceptance of a knot's membership offer, w/ knot-DID as rkey", "key": "any", "record": { "type": "object", diff --git a/lexicons/knot/memberInvite.json b/lexicons/legacy/knot/memberInvite.json similarity index 72% rename from lexicons/knot/memberInvite.json rename to lexicons/legacy/knot/memberInvite.json index faf69b758..d19b6887d 100644 --- a/lexicons/knot/memberInvite.json +++ b/lexicons/legacy/knot/memberInvite.json @@ -6,7 +6,7 @@ "defs": { "main": { "type": "record", - "description": "Offer of membership on this knot, w/ invitee-DID as rkey", + "description": "DEPRECATED: legacy consent flow for the old knotserver; knot2 grants membership on addMember alone. Offer of membership on this knot, w/ invitee-DID as rkey", "key": "any", "record": { "type": "object", diff --git a/localinfra/Caddyfile b/localinfra/Caddyfile index fd188409c..f9f7dac35 100644 --- a/localinfra/Caddyfile +++ b/localinfra/Caddyfile @@ -60,7 +60,7 @@ hydrant.tngl.boltless.dev { # knot2 answers preflight itself (knot2/crates/knot-edge/src/cors.rs), so this block # doesn't import cors: a browser rejects a response with two Access-Control-Allow-Origin -# values, and web/ posts sh.tangled.knot.acceptMembership and sh.tangled.git.keepCommit +# values, and web/ posts sh.tangled.git.keepCommit # straight from the browser to the knot serving the repo. knot2.tngl.boltless.dev { tls internal diff --git a/web/src/lib/api/access.ts b/web/src/lib/api/access.ts index 6c2c571df..55ffce7c4 100644 --- a/web/src/lib/api/access.ts +++ b/web/src/lib/api/access.ts @@ -26,7 +26,6 @@ export interface RepoIdentity { const COLLABORATOR_PAGES = 5; -// pending invites grant nothing, the knot requires an acceptance record export const resolveRepoAccess = async ( ctx: BobbinContext, repo: RepoIdentity, diff --git a/web/src/lib/api/lexicons/index.ts b/web/src/lib/api/lexicons/index.ts index 2ab0db070..08500e450 100644 --- a/web/src/lib/api/lexicons/index.ts +++ b/web/src/lib/api/lexicons/index.ts @@ -36,8 +36,12 @@ export * as OrgTangledTempRepoDisableSite from "./types/org/tangled/temp/repo/di export * as OrgTangledTempRepoGetSiteConfig from "./types/org/tangled/temp/repo/getSiteConfig.js"; export * as OrgTangledTempRepoUpdateSiteConfig from "./types/org/tangled/temp/repo/updateSiteConfig.js"; export * as OrgTangledTempSearchSearchCode from "./types/org/tangled/temp/search/searchCode.js"; +export * as OrgTangledTempServerAddMember from "./types/org/tangled/temp/server/addMember.js"; +export * as OrgTangledTempServerBanUser from "./types/org/tangled/temp/server/banUser.js"; export * as OrgTangledTempServerCreateInviteCode from "./types/org/tangled/temp/server/createInviteCode.js"; export * as OrgTangledTempServerRedeemInviteCode from "./types/org/tangled/temp/server/redeemInviteCode.js"; +export * as OrgTangledTempServerRemoveMember from "./types/org/tangled/temp/server/removeMember.js"; +export * as OrgTangledTempServerUnbanUser from "./types/org/tangled/temp/server/unbanUser.js"; export * as OrgTangledTempSiteClaimDomain from "./types/org/tangled/temp/site/claimDomain.js"; export * as OrgTangledTempSiteGetDomainClaim from "./types/org/tangled/temp/site/getDomainClaim.js"; export * as OrgTangledTempSiteReleaseDomain from "./types/org/tangled/temp/site/releaseDomain.js"; @@ -139,7 +143,6 @@ export * as ShTangledGraphListVouchesBy from "./types/sh/tangled/graph/listVouch export * as ShTangledGraphVouch from "./types/sh/tangled/graph/vouch.js"; export * as ShTangledIdentityResolveCommitters from "./types/sh/tangled/identity/resolveCommitters.js"; export * as ShTangledKnot from "./types/sh/tangled/knot.js"; -export * as ShTangledKnotAcceptMembership from "./types/sh/tangled/knot/acceptMembership.js"; export * as ShTangledKnotAddMember from "./types/sh/tangled/knot/addMember.js"; export * as ShTangledKnotBan from "./types/sh/tangled/knot/ban.js"; export * as ShTangledKnotCountKnots from "./types/sh/tangled/knot/countKnots.js"; @@ -147,13 +150,8 @@ export * as ShTangledKnotCountMembers from "./types/sh/tangled/knot/countMembers export * as ShTangledKnotCountMembersBy from "./types/sh/tangled/knot/countMembersBy.js"; export * as ShTangledKnotListKeys from "./types/sh/tangled/knot/listKeys.js"; export * as ShTangledKnotListKnots from "./types/sh/tangled/knot/listKnots.js"; -export * as ShTangledKnotListMemberInvites from "./types/sh/tangled/knot/listMemberInvites.js"; -export * as ShTangledKnotListMemberInvitesBy from "./types/sh/tangled/knot/listMemberInvitesBy.js"; export * as ShTangledKnotListMembers from "./types/sh/tangled/knot/listMembers.js"; -export * as ShTangledKnotListMembersBy from "./types/sh/tangled/knot/listMembersBy.js"; export * as ShTangledKnotMember from "./types/sh/tangled/knot/member.js"; -export * as ShTangledKnotMemberAcceptance from "./types/sh/tangled/knot/memberAcceptance.js"; -export * as ShTangledKnotMemberInvite from "./types/sh/tangled/knot/memberInvite.js"; export * as ShTangledKnotRemoveMember from "./types/sh/tangled/knot/removeMember.js"; export * as ShTangledKnotUnban from "./types/sh/tangled/knot/unban.js"; export * as ShTangledKnotVersion from "./types/sh/tangled/knot/version.js"; diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/acceptMembership.ts b/web/src/lib/api/lexicons/types/org/tangled/temp/server/addMember.ts similarity index 74% rename from web/src/lib/api/lexicons/types/sh/tangled/knot/acceptMembership.ts rename to web/src/lib/api/lexicons/types/org/tangled/temp/server/addMember.ts index 8a3427a64..549c8ed46 100644 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/acceptMembership.ts +++ b/web/src/lib/api/lexicons/types/org/tangled/temp/server/addMember.ts @@ -3,16 +3,16 @@ import * as v from "@atcute/lexicons/validations"; import type {} from "@atcute/lexicons/ambient"; const _mainSchema = /*#__PURE__*/ v.procedure( - "sh.tangled.knot.acceptMembership", + "org.tangled.temp.server.addMember", { params: null, input: { type: "lex", schema: /*#__PURE__*/ v.object({ /** - * AT-URI of the sh.tangled.knot.memberAcceptance record, w/ knot-DID as rkey + * DID of the member to add */ - acceptance: /*#__PURE__*/ v.resourceUriString(), + subject: /*#__PURE__*/ v.didString(), }), }, output: null, @@ -30,6 +30,6 @@ export interface $input extends v.InferXRPCBodyInput {} declare module "@atcute/lexicons/ambient" { interface XRPCProcedures { - "sh.tangled.knot.acceptMembership": mainSchema; + "org.tangled.temp.server.addMember": mainSchema; } } diff --git a/web/src/lib/api/lexicons/types/org/tangled/temp/server/banUser.ts b/web/src/lib/api/lexicons/types/org/tangled/temp/server/banUser.ts new file mode 100644 index 000000000..5129a97ab --- /dev/null +++ b/web/src/lib/api/lexicons/types/org/tangled/temp/server/banUser.ts @@ -0,0 +1,35 @@ +import type {} from "@atcute/lexicons"; +import * as v from "@atcute/lexicons/validations"; +import type {} from "@atcute/lexicons/ambient"; + +const _mainSchema = /*#__PURE__*/ v.procedure( + "org.tangled.temp.server.banUser", + { + params: null, + input: { + type: "lex", + schema: /*#__PURE__*/ v.object({ + /** + * DID of the account to ban + */ + subject: /*#__PURE__*/ v.didString(), + }), + }, + output: null, + }, +); + +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} + +export const mainSchema = _mainSchema as mainSchema; + +export interface $params {} +export interface $input extends v.InferXRPCBodyInput {} + +declare module "@atcute/lexicons/ambient" { + interface XRPCProcedures { + "org.tangled.temp.server.banUser": mainSchema; + } +} diff --git a/web/src/lib/api/lexicons/types/org/tangled/temp/server/removeMember.ts b/web/src/lib/api/lexicons/types/org/tangled/temp/server/removeMember.ts new file mode 100644 index 000000000..ac92e9deb --- /dev/null +++ b/web/src/lib/api/lexicons/types/org/tangled/temp/server/removeMember.ts @@ -0,0 +1,35 @@ +import type {} from "@atcute/lexicons"; +import * as v from "@atcute/lexicons/validations"; +import type {} from "@atcute/lexicons/ambient"; + +const _mainSchema = /*#__PURE__*/ v.procedure( + "org.tangled.temp.server.removeMember", + { + params: null, + input: { + type: "lex", + schema: /*#__PURE__*/ v.object({ + /** + * DID of the member to remove + */ + subject: /*#__PURE__*/ v.didString(), + }), + }, + output: null, + }, +); + +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} + +export const mainSchema = _mainSchema as mainSchema; + +export interface $params {} +export interface $input extends v.InferXRPCBodyInput {} + +declare module "@atcute/lexicons/ambient" { + interface XRPCProcedures { + "org.tangled.temp.server.removeMember": mainSchema; + } +} diff --git a/web/src/lib/api/lexicons/types/org/tangled/temp/server/unbanUser.ts b/web/src/lib/api/lexicons/types/org/tangled/temp/server/unbanUser.ts new file mode 100644 index 000000000..f47dd2879 --- /dev/null +++ b/web/src/lib/api/lexicons/types/org/tangled/temp/server/unbanUser.ts @@ -0,0 +1,35 @@ +import type {} from "@atcute/lexicons"; +import * as v from "@atcute/lexicons/validations"; +import type {} from "@atcute/lexicons/ambient"; + +const _mainSchema = /*#__PURE__*/ v.procedure( + "org.tangled.temp.server.unbanUser", + { + params: null, + input: { + type: "lex", + schema: /*#__PURE__*/ v.object({ + /** + * DID of the account to unban + */ + subject: /*#__PURE__*/ v.didString(), + }), + }, + output: null, + }, +); + +type main$schematype = typeof _mainSchema; + +export interface mainSchema extends main$schematype {} + +export const mainSchema = _mainSchema as mainSchema; + +export interface $params {} +export interface $input extends v.InferXRPCBodyInput {} + +declare module "@atcute/lexicons/ambient" { + interface XRPCProcedures { + "org.tangled.temp.server.unbanUser": mainSchema; + } +} diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvites.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvites.ts deleted file mode 100644 index aad9644c9..000000000 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvites.ts +++ /dev/null @@ -1,81 +0,0 @@ -import type {} from "@atcute/lexicons"; -import * as v from "@atcute/lexicons/validations"; -import type {} from "@atcute/lexicons/ambient"; - -const _inviteItemSchema = /*#__PURE__*/ v.object({ - $type: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.literal("sh.tangled.knot.listMemberInvites#inviteItem"), - ), - /** - * DID that made the offer - */ - addedBy: /*#__PURE__*/ v.didString(), - /** - * When the knot made the offer. This listing sorts and pages on it. - */ - createdAt: /*#__PURE__*/ v.datetimeString(), - /** - * DID the knot offered membership to - */ - subject: /*#__PURE__*/ v.didString(), -}); -const _mainSchema = /*#__PURE__*/ v.query("sh.tangled.knot.listMemberInvites", { - params: /*#__PURE__*/ v.object({ - /** - * Pagination cursor - */ - cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), - /** - * @minimum 1 - * @maximum 1000 - * @default 50 - */ - limit: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ - /*#__PURE__*/ v.integerRange(1, 1000), - ]), - 50, - ), - /** - * Sort direction by createdAt. - * @default "desc" - */ - order: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), - "desc", - ), - /** - * Knot identifier whose outstanding membership offers to list. - */ - subject: /*#__PURE__*/ v.didString(), - }), - output: { - type: "lex", - schema: /*#__PURE__*/ v.object({ - cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), - get items() { - return /*#__PURE__*/ v.array(inviteItemSchema); - }, - }), - }, -}); - -type inviteItem$schematype = typeof _inviteItemSchema; -type main$schematype = typeof _mainSchema; - -export interface inviteItemSchema extends inviteItem$schematype {} -export interface mainSchema extends main$schematype {} - -export const inviteItemSchema = _inviteItemSchema as inviteItemSchema; -export const mainSchema = _mainSchema as mainSchema; - -export interface InviteItem extends v.InferInput {} - -export interface $params extends v.InferInput {} -export interface $output extends v.InferXRPCBodyInput {} - -declare module "@atcute/lexicons/ambient" { - interface XRPCQueries { - "sh.tangled.knot.listMemberInvites": mainSchema; - } -} diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvitesBy.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvitesBy.ts deleted file mode 100644 index fa3a5a657..000000000 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMemberInvitesBy.ts +++ /dev/null @@ -1,72 +0,0 @@ -import type {} from "@atcute/lexicons"; -import * as v from "@atcute/lexicons/validations"; -import type {} from "@atcute/lexicons/ambient"; - -const _inviteItemSchema = /*#__PURE__*/ v.object({ - $type: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.literal("sh.tangled.knot.listMemberInvitesBy#inviteItem"), - ), - /** - * DID that made the offer. - */ - addedBy: /*#__PURE__*/ v.didString(), - /** - * When the knot made the offer. This listing sorts on it by newest first. - */ - createdAt: /*#__PURE__*/ v.datetimeString(), - /** - * did:web of knot that made this offer. Check against pending. - */ - knot: /*#__PURE__*/ v.didString(), - /** - * Invite record on knot's repo. - */ - uri: /*#__PURE__*/ v.resourceUriString(), -}); -const _mainSchema = /*#__PURE__*/ v.query( - "sh.tangled.knot.listMemberInvitesBy", - { - params: /*#__PURE__*/ v.object({ - /** - * Actor DID offered membership. - */ - subject: /*#__PURE__*/ v.didString(), - }), - output: { - type: "lex", - schema: /*#__PURE__*/ v.object({ - get items() { - return /*#__PURE__*/ v.array(inviteItemSchema); - }, - /** - * The knots that this indexation hasn't yet read. - */ - pending: /*#__PURE__*/ v.array(/*#__PURE__*/ v.didString()), - /** - * Per-subject cut dropped offers from items. If truncated is true, missing offers won't advertise that they were withdrawn, same as with pending knots. - */ - truncated: /*#__PURE__*/ v.boolean(), - }), - }, - }, -); - -type inviteItem$schematype = typeof _inviteItemSchema; -type main$schematype = typeof _mainSchema; - -export interface inviteItemSchema extends inviteItem$schematype {} -export interface mainSchema extends main$schematype {} - -export const inviteItemSchema = _inviteItemSchema as inviteItemSchema; -export const mainSchema = _mainSchema as mainSchema; - -export interface InviteItem extends v.InferInput {} - -export interface $params extends v.InferInput {} -export interface $output extends v.InferXRPCBodyInput {} - -declare module "@atcute/lexicons/ambient" { - interface XRPCQueries { - "sh.tangled.knot.listMemberInvitesBy": mainSchema; - } -} diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembers.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembers.ts index f06d26078..46b685d79 100644 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembers.ts +++ b/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembers.ts @@ -15,13 +15,9 @@ const _listItemSchema = /*#__PURE__*/ v.object({ */ cid: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.cidString()), /** - * When the knot offered membership + * When the member was added. This listing sorts and pages on it. */ createdAt: /*#__PURE__*/ v.datetimeString(), - /** - * When the membership took effect. This listing sorts and pages on it. - */ - effectiveSince: /*#__PURE__*/ v.datetimeString(), /** * DID of the member */ @@ -30,10 +26,6 @@ const _listItemSchema = /*#__PURE__*/ v.object({ * Optional record AT-URI for record-backed indexers */ uri: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.resourceUriString()), - /** - * When the knot resolved the member's own acceptance record. Absent on a grant that predates the consent model. - */ - verifiedAt: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.datetimeString()), }); const _mainSchema = /*#__PURE__*/ v.query("sh.tangled.knot.listMembers", { params: /*#__PURE__*/ v.object({ @@ -58,7 +50,7 @@ const _mainSchema = /*#__PURE__*/ v.query("sh.tangled.knot.listMembers", { */ offset: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), /** - * Sort direction by effectiveSince. + * Sort direction by createdAt. * @default "desc" */ order: /*#__PURE__*/ v.optional( diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembersBy.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembersBy.ts deleted file mode 100644 index a9c8ea9ac..000000000 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/listMembersBy.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type {} from "@atcute/lexicons"; -import * as v from "@atcute/lexicons/validations"; -import type {} from "@atcute/lexicons/ambient"; -import * as ShTangledKnotListMembers from "./listMembers.js"; - -const _mainSchema = /*#__PURE__*/ v.query("sh.tangled.knot.listMembersBy", { - params: /*#__PURE__*/ v.object({ - /** - * Pagination cursor - */ - cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), - /** - * @minimum 1 - * @maximum 1000 - * @default 50 - */ - limit: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.constrain(/*#__PURE__*/ v.integer(), [ - /*#__PURE__*/ v.integerRange(1, 1000), - ]), - 50, - ), - /** - * Absolute offset for random-access pagination. Mutually exclusive with cursor; offsets drift under concurrent writes, so follow up with the returned cursor. - * @minimum 0 - */ - offset: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), - /** - * Sort direction by createdAt. - * @default "desc" - */ - order: /*#__PURE__*/ v.optional( - /*#__PURE__*/ v.string<"asc" | "desc" | (string & {})>(), - "desc", - ), - /** - * Actor DID whose knot-member authorings to list. - */ - subject: /*#__PURE__*/ v.didString(), - }), - output: { - type: "lex", - schema: /*#__PURE__*/ v.object({ - cursor: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.string()), - get items() { - return /*#__PURE__*/ v.array(ShTangledKnotListMembers.listItemSchema); - }, - /** - * Total items in the full list; omitted for filtered or merged views - */ - total: /*#__PURE__*/ v.optional(/*#__PURE__*/ v.integer()), - }), - }, -}); - -type main$schematype = typeof _mainSchema; - -export interface mainSchema extends main$schematype {} - -export const mainSchema = _mainSchema as mainSchema; - -export interface $params extends v.InferInput {} -export interface $output extends v.InferXRPCBodyInput {} - -declare module "@atcute/lexicons/ambient" { - interface XRPCQueries { - "sh.tangled.knot.listMembersBy": mainSchema; - } -} diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/memberAcceptance.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/memberAcceptance.ts deleted file mode 100644 index 0822f0699..000000000 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/memberAcceptance.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type {} from "@atcute/lexicons"; -import * as v from "@atcute/lexicons/validations"; -import type {} from "@atcute/lexicons/ambient"; - -const _mainSchema = /*#__PURE__*/ v.record( - /*#__PURE__*/ v.string(), - /*#__PURE__*/ v.object({ - $type: /*#__PURE__*/ v.literal("sh.tangled.knot.memberAcceptance"), - /** - * Invite acceptance timestamp - */ - createdAt: /*#__PURE__*/ v.datetimeString(), - }), -); - -type main$schematype = typeof _mainSchema; - -export interface mainSchema extends main$schematype {} - -export const mainSchema = _mainSchema as mainSchema; - -export interface Main extends v.InferInput {} - -declare module "@atcute/lexicons/ambient" { - interface Records { - "sh.tangled.knot.memberAcceptance": mainSchema; - } -} diff --git a/web/src/lib/api/lexicons/types/sh/tangled/knot/memberInvite.ts b/web/src/lib/api/lexicons/types/sh/tangled/knot/memberInvite.ts deleted file mode 100644 index f363c7e2d..000000000 --- a/web/src/lib/api/lexicons/types/sh/tangled/knot/memberInvite.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type {} from "@atcute/lexicons"; -import * as v from "@atcute/lexicons/validations"; -import type {} from "@atcute/lexicons/ambient"; - -const _mainSchema = /*#__PURE__*/ v.record( - /*#__PURE__*/ v.string(), - /*#__PURE__*/ v.object({ - $type: /*#__PURE__*/ v.literal("sh.tangled.knot.memberInvite"), - /** - * Invite issue timestamp - */ - createdAt: /*#__PURE__*/ v.datetimeString(), - }), -); - -type main$schematype = typeof _mainSchema; - -export interface mainSchema extends main$schematype {} - -export const mainSchema = _mainSchema as mainSchema; - -export interface Main extends v.InferInput {} - -declare module "@atcute/lexicons/ambient" { - interface Records { - "sh.tangled.knot.memberInvite": mainSchema; - } -}