From 94c15f58ecd43dfc65ef971525bf545b675dd6ed Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Thu, 26 Sep 2024 22:09:39 +0800 Subject: [PATCH] :sparkles: Allow user block user initially --- pkg/internal/server/api/index.go | 4 ++- pkg/internal/server/api/relationships_api.go | 32 ++++++++++++++++++++ pkg/internal/services/relationships.go | 20 ++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/pkg/internal/server/api/index.go b/pkg/internal/server/api/index.go index 1651c3c..aff118b 100644 --- a/pkg/internal/server/api/index.go +++ b/pkg/internal/server/api/index.go @@ -67,12 +67,14 @@ func MapAPIs(app *fiber.App, baseURL string) { relations := me.Group("/relations").Name("Relations") { + relations.Post("/", makeFriendship) + relations.Post("/block", makeBlockship) + relations.Get("/", listRelationship) relations.Get("/:relatedId", getRelationship) relations.Put("/:relatedId", editRelationship) relations.Delete("/:relatedId", deleteRelationship) - relations.Post("/", makeFriendship) relations.Post("/:relatedId", makeFriendship) relations.Post("/:relatedId/accept", acceptFriend) relations.Post("/:relatedId/decline", declineFriend) diff --git a/pkg/internal/server/api/relationships_api.go b/pkg/internal/server/api/relationships_api.go index 8175460..77fe8d6 100644 --- a/pkg/internal/server/api/relationships_api.go +++ b/pkg/internal/server/api/relationships_api.go @@ -136,6 +136,38 @@ func makeFriendship(c *fiber.Ctx) error { } } +func makeBlockship(c *fiber.Ctx) error { + if err := exts.EnsureAuthenticated(c); err != nil { + return err + } + user := c.Locals("user").(models.Account) + relatedName := c.Query("related") + relatedId, _ := c.ParamsInt("relatedId", 0) + + var err error + var related models.Account + if relatedId > 0 { + related, err = services.GetAccount(uint(relatedId)) + if err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } + } else if len(relatedName) > 0 { + related, err = services.LookupAccount(relatedName) + if err != nil { + return fiber.NewError(fiber.StatusNotFound, err.Error()) + } + } else { + return fiber.NewError(fiber.StatusBadRequest, "must one of username or user id") + } + + friend, err := services.NewBlockship(user, related) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else { + return c.JSON(friend) + } +} + func acceptFriend(c *fiber.Ctx) error { if err := exts.EnsureAuthenticated(c); err != nil { return err diff --git a/pkg/internal/services/relationships.go b/pkg/internal/services/relationships.go index 731863d..3c458c7 100644 --- a/pkg/internal/services/relationships.go +++ b/pkg/internal/services/relationships.go @@ -81,6 +81,26 @@ func DeleteRelationship(relationship models.AccountRelationship) error { return nil } +func NewBlockship(userA models.Account, userB models.Account) (models.AccountRelationship, error) { + var err error + var rel models.AccountRelationship + if rel, err = GetRelationWithTwoNode(userA.ID, userB.ID, true); err == nil { + rel.Status = models.RelationshipBlocked + } else { + rel = models.AccountRelationship{ + AccountID: userA.ID, + RelatedID: userB.ID, + Status: models.RelationshipBlocked, + } + } + + if err := database.C.Save(&rel).Error; err != nil { + return rel, err + } + + return rel, nil +} + func NewFriend(userA models.Account, userB models.Account, skipPending ...bool) (models.AccountRelationship, error) { relA := models.AccountRelationship{ AccountID: userA.ID,