From 12e51b5a22d1eda452cb73c63081d38e78150341 Mon Sep 17 00:00:00 2001 From: Aykhan Shahsuvarov Date: Sat, 24 May 2025 19:32:36 +0400 Subject: [PATCH] Add 'users', 'users/valid/', and 'users/invalid/' endpoints to API --- cmd/api/version.go | 2 +- pkg/api/base.go | 3 +++ pkg/api/handler/feed.go | 44 +++++++++++++++++++++++++++++++ pkg/feed/az.go | 2 +- pkg/generator/az/base.go | 2 +- pkg/generator/az/lists.go | 2 +- pkg/generator/base.go | 55 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 106 insertions(+), 4 deletions(-) diff --git a/cmd/api/version.go b/cmd/api/version.go index 310674e..df39dee 100644 --- a/cmd/api/version.go +++ b/cmd/api/version.go @@ -1,3 +1,3 @@ package main -const version = "0.1.0" +const version = "0.2.0" diff --git a/pkg/api/base.go b/pkg/api/base.go index 9f44d82..2f471e8 100644 --- a/pkg/api/base.go +++ b/pkg/api/base.go @@ -34,6 +34,9 @@ func Run( "GET /xrpc/app.bsky.feed.getFeedSkeleton", authMiddleware.JWTAuthMiddleware(http.HandlerFunc(feedHandler.GetFeedSkeleton)), ) + mux.HandleFunc("GET /{feed}/users", feedHandler.GetAllUsers) + mux.HandleFunc("GET /{feed}/users/valid/", feedHandler.GetValidUsers) + mux.HandleFunc("GET /{feed}/users/invalid/", feedHandler.GetInvalidUsers) httpServer := &http.Server{ Addr: fmt.Sprintf(":%d", apiConfig.APIPort), diff --git a/pkg/api/handler/feed.go b/pkg/api/handler/feed.go index d4b7471..36a7cc9 100644 --- a/pkg/api/handler/feed.go +++ b/pkg/api/handler/feed.go @@ -10,6 +10,7 @@ import ( "github.com/aykhans/bsky-feedgen/pkg/api/middleware" "github.com/aykhans/bsky-feedgen/pkg/api/response" "github.com/aykhans/bsky-feedgen/pkg/feed" + generatorAz "github.com/aykhans/bsky-feedgen/pkg/generator/az" "github.com/aykhans/bsky-feedgen/pkg/types" "github.com/aykhans/bsky-feedgen/pkg/utils" "github.com/bluesky-social/indigo/api/bsky" @@ -99,3 +100,46 @@ func (handler *FeedHandler) GetFeedSkeleton(w http.ResponseWriter, r *http.Reque Cursor: newCursor, }) } + +func (handler *FeedHandler) GetValidUsers(w http.ResponseWriter, r *http.Request) { + feed := r.PathValue("feed") + + validUsers := make([]string, 0) + switch feed { + case "AzPulse": + validUsers = generatorAz.Users.GetValidUsers() + } + + response.JSON(w, 200, response.M{ + "feed": feed, + "users": validUsers, + }) +} + +func (handler *FeedHandler) GetInvalidUsers(w http.ResponseWriter, r *http.Request) { + feed := r.PathValue("feed") + + invalidUsers := make([]string, 0) + switch feed { + case "AzPulse": + invalidUsers = generatorAz.Users.GetInvalidUsers() + } + + response.JSON(w, 200, response.M{ + "feed": feed, + "users": invalidUsers, + }) +} + +func (handler *FeedHandler) GetAllUsers(w http.ResponseWriter, r *http.Request) { + feed := r.PathValue("feed") + + responseData := response.M{"feed": feed} + switch feed { + case "AzPulse": + responseData["valid_users"] = generatorAz.Users.GetValidUsers() + responseData["invalid_users"] = generatorAz.Users.GetInvalidUsers() + } + + response.JSON(w, 200, responseData) +} diff --git a/pkg/feed/az.go b/pkg/feed/az.go index 708aabc..e71eb4a 100644 --- a/pkg/feed/az.go +++ b/pkg/feed/az.go @@ -39,7 +39,7 @@ func (f *FeedAz) Describe(_ context.Context) bsky.FeedDescribeFeedGenerator_Feed func (f *FeedAz) GetPage( ctx context.Context, - _ string, + _ string, // user did limit int64, cursor string, ) ([]*bsky.FeedDefs_SkeletonFeedPost, *string, error) { diff --git a/pkg/generator/az/base.go b/pkg/generator/az/base.go index 313a83f..2f7d5b9 100644 --- a/pkg/generator/az/base.go +++ b/pkg/generator/az/base.go @@ -114,7 +114,7 @@ func (generator *Generator) IsValid(post *collections.Post) bool { return false } - if isValidUser := users.IsValid(post.DID); isValidUser != nil { + if isValidUser := Users.IsValid(post.DID); isValidUser != nil { return *isValidUser } diff --git a/pkg/generator/az/lists.go b/pkg/generator/az/lists.go index 4a7b844..88bd79d 100644 --- a/pkg/generator/az/lists.go +++ b/pkg/generator/az/lists.go @@ -2,7 +2,7 @@ package az import "github.com/aykhans/bsky-feedgen/pkg/generator" -var users = generator.Users{ +var Users = generator.Users{ // Invalid "did:plc:5zww7zorx2ajw7hqrhuix3ba": false, "did:plc:c4vhz47h566t2ntgd7gtawen": false, diff --git a/pkg/generator/base.go b/pkg/generator/base.go index 10328f2..16bbcb9 100644 --- a/pkg/generator/base.go +++ b/pkg/generator/base.go @@ -4,6 +4,15 @@ import "github.com/aykhans/bsky-feedgen/pkg/utils" type Users map[string]bool +// IsValid checks if a given DID exists in the Users map and returns its validity status. +// +// Parameters: +// +// did: The Decentralized Identifier string to check +// +// Returns: +// - *bool: A pointer to the validity status if the DID exists in the map +// - nil: If the DID does not exist in the map func (u Users) IsValid(did string) *bool { isValid, ok := u[did] if ok == false { @@ -12,3 +21,49 @@ func (u Users) IsValid(did string) *bool { return utils.ToPtr(isValid) } + +// GetValidUsers returns a slice of DIDs that are marked as valid in the Users map. +// +// Returns: +// - []string: A slice of valid DIDs, limited by the specified parameters +func (u Users) GetValidUsers() []string { + validUsers := make([]string, 0) + + for did, isValid := range u { + if isValid { + validUsers = append(validUsers, did) + } + } + + return validUsers +} + +// GetInvalidUsers returns a slice of DIDs that are marked as invalid in the Users map. +// +// Returns: +// - []string: A slice of invalid DIDs, limited by the specified parameters +func (u Users) GetInvalidUsers() []string { + invalidUsers := make([]string, 0) + + for did, isValid := range u { + if !isValid { + invalidUsers = append(invalidUsers, did) + } + } + + return invalidUsers +} + +// GetAll returns a slice of all DIDs in the Users map, regardless of validity status. +// +// Returns: +// - []string: A slice containing all DIDs in the map +func (u Users) GetAll() []string { + allUsers := make([]string, 0, len(u)) + + for did := range u { + allUsers = append(allUsers, did) + } + + return allUsers +}