A container registry that uses the AT Protocol for manifest storage and S3 for blob storage.
0
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