A container registry that uses the AT Protocol for manifest storage and S3 for blob storage. atcr.io
docker container atproto go
80
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix getRecord

+37 -24
+32 -20
pkg/hold/pds/crew.go
··· 4 4 "bytes" 5 5 "context" 6 6 "fmt" 7 + "strings" 7 8 "time" 8 9 9 10 "github.com/bluesky-social/indigo/repo" ··· 64 65 } 65 66 66 67 // GetCrewMember retrieves a crew member by their record key 67 - func (p *HoldPDS) GetCrewMember(ctx context.Context, rkey string) (*CrewRecord, error) { 68 + func (p *HoldPDS) GetCrewMember(ctx context.Context, rkey string) (cid.Cid, *CrewRecord, error) { 68 69 path := fmt.Sprintf("%s/%s", CrewCollection, rkey) 69 70 70 - _, rec, err := p.repo.GetRecord(ctx, path) 71 + // Get the record bytes and decode manually (indigo doesn't know our custom type) 72 + recordCID, recBytes, err := p.repo.GetRecordBytes(ctx, path) 71 73 if err != nil { 72 - return nil, fmt.Errorf("failed to get crew record: %w", err) 74 + return cid.Undef, nil, fmt.Errorf("failed to get crew record: %w", err) 73 75 } 74 76 75 - crewRecord, ok := rec.(*CrewRecord) 76 - if !ok { 77 - return nil, fmt.Errorf("record is not a CrewRecord") 77 + // Decode the CBOR bytes into our CrewRecord type 78 + var crewRecord CrewRecord 79 + if err := crewRecord.UnmarshalCBOR(bytes.NewReader(*recBytes)); err != nil { 80 + return cid.Undef, nil, fmt.Errorf("failed to decode crew record: %w", err) 78 81 } 79 82 80 - return crewRecord, nil 83 + return recordCID, &crewRecord, nil 84 + } 85 + 86 + // CrewMemberWithKey pairs a crew record with its rkey and CID 87 + type CrewMemberWithKey struct { 88 + Rkey string 89 + Cid cid.Cid 90 + Record *CrewRecord 81 91 } 82 92 83 - // ListCrewMembers returns all crew members 84 - func (p *HoldPDS) ListCrewMembers(ctx context.Context) ([]*CrewRecord, error) { 85 - var crew []*CrewRecord 93 + // ListCrewMembers returns all crew members with their rkeys 94 + func (p *HoldPDS) ListCrewMembers(ctx context.Context) ([]*CrewMemberWithKey, error) { 95 + var crew []*CrewMemberWithKey 86 96 87 97 err := p.repo.ForEach(ctx, CrewCollection, func(k string, v cid.Cid) error { 88 - // Get the record bytes and decode manually (indigo doesn't know our custom type) 89 - _, recBytes, err := p.repo.GetRecordBytes(ctx, k) 98 + // Extract rkey from full path (k is like "io.atcr.hold.crew/3m37dr2ddit22") 99 + parts := strings.Split(k, "/") 100 + rkey := parts[len(parts)-1] 101 + 102 + // Get the full record using GetCrewMember 103 + recordCID, crewRecord, err := p.GetCrewMember(ctx, rkey) 90 104 if err != nil { 91 105 return err 92 106 } 93 107 94 - // Decode the CBOR bytes into our CrewRecord type 95 - var crewRecord CrewRecord 96 - if err := crewRecord.UnmarshalCBOR(bytes.NewReader(*recBytes)); err != nil { 97 - return err 98 - } 99 - 100 - crew = append(crew, &crewRecord) 108 + crew = append(crew, &CrewMemberWithKey{ 109 + Rkey: rkey, 110 + Cid: recordCID, 111 + Record: crewRecord, 112 + }) 101 113 return nil 102 114 }) 103 115 ··· 105 117 // If the collection doesn't exist yet (empty repo or no records created), 106 118 // return empty list instead of error 107 119 if err.Error() == "mst: not found" { 108 - return []*CrewRecord{}, nil 120 + return []*CrewMemberWithKey{}, nil 109 121 } 110 122 return nil, fmt.Errorf("failed to list crew members: %w", err) 111 123 }
+5 -4
pkg/hold/pds/xrpc.go
··· 175 175 return 176 176 } 177 177 178 - crewRecord, err := h.pds.GetCrewMember(r.Context(), rkey) 178 + recordCID, crewRecord, err := h.pds.GetCrewMember(r.Context(), rkey) 179 179 if err != nil { 180 180 http.Error(w, fmt.Sprintf("failed to get record: %v", err), http.StatusNotFound) 181 181 return ··· 183 183 184 184 response := map[string]any{ 185 185 "uri": fmt.Sprintf("at://%s/%s/%s", h.pds.DID(), collection, rkey), 186 + "cid": recordCID.String(), 186 187 "value": crewRecord, 187 188 } 188 189 ··· 224 225 225 226 records := make([]map[string]any, len(crew)) 226 227 for i, member := range crew { 227 - // TODO: Get actual rkey from somewhere 228 228 records[i] = map[string]any{ 229 - "uri": fmt.Sprintf("at://%s/%s/%s", h.pds.DID(), collection, member.Member), 230 - "value": member, 229 + "uri": fmt.Sprintf("at://%s/%s/%s", h.pds.DID(), collection, member.Rkey), 230 + "cid": member.Cid.String(), 231 + "value": member.Record, 231 232 } 232 233 } 233 234