chore: init

This commit is contained in:
DevMiner 2024-08-11 03:51:22 +02:00
commit 320715f3e7
174 changed files with 42083 additions and 0 deletions

View file

@ -0,0 +1,35 @@
package user_handler
import (
"github.com/gofiber/fiber/v2"
"github.com/lysand-org/versia-go/ent"
"github.com/lysand-org/versia-go/internal/api_schema"
)
func (i *Handler) CreateUser(c *fiber.Ctx) error {
var req api_schema.CreateUserRequest
if err := c.BodyParser(&req); err != nil {
return api_schema.ErrInvalidRequestBody(nil)
}
if err := i.bodyValidator.Validate(req); err != nil {
return err
}
u, err := i.userService.NewUser(c.UserContext(), req.Username, req.Password)
if err != nil {
// TODO: Wrap this in a custom error
if ent.IsConstraintError(err) {
return api_schema.ErrUsernameTaken(nil)
}
i.log.Error(err, "Failed to create user", "username", req.Username)
return api_schema.ErrInternalServerError(nil)
}
return c.JSON(api_schema.User{
ID: u.ID,
Username: u.Username,
})
}

View file

@ -0,0 +1,31 @@
package user_handler
import (
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/lysand-org/versia-go/internal/api_schema"
)
func (i *Handler) GetUser(c *fiber.Ctx) error {
parsedRequestedUserID, err := uuid.Parse(c.Params("id"))
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid user ID",
})
}
u, err := i.userService.GetUserByID(c.UserContext(), parsedRequestedUserID)
if err != nil {
i.log.Error(err, "Failed to query user", "id", parsedRequestedUserID)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "Failed to query user",
})
}
if u == nil {
return api_schema.ErrNotFound(map[string]any{"id": parsedRequestedUserID})
}
return c.JSON(u)
}

View file

@ -0,0 +1,46 @@
package user_handler
import (
"github.com/go-logr/logr"
"github.com/gofiber/fiber/v2"
"github.com/lysand-org/versia-go/internal/service"
"github.com/lysand-org/versia-go/internal/validators"
)
type Handler struct {
userService service.UserService
federationService service.FederationService
inboxService service.InboxService
bodyValidator validators.BodyValidator
requestValidator validators.RequestValidator
log logr.Logger
}
func New(userService service.UserService, federationService service.FederationService, inboxService service.InboxService, bodyValidator validators.BodyValidator, requestValidator validators.RequestValidator, log logr.Logger) *Handler {
return &Handler{
userService: userService,
federationService: federationService,
inboxService: inboxService,
bodyValidator: bodyValidator,
requestValidator: requestValidator,
log: log,
}
}
func (i *Handler) Register(r fiber.Router) {
// TODO: Handle this differently
// There might be other routes that might want to also add their stuff to the robots.txt
r.Get("/robots.txt", i.RobotsTXT)
r.Get("/.well-known/webfinger", i.Webfinger)
r.Get("/api/app/users/:id", i.GetUser)
r.Post("/api/app/users/", i.CreateUser)
r.Get("/api/users/:id", i.GetLysandUser)
r.Post("/api/users/:id/inbox", i.LysandInbox)
}

View file

@ -0,0 +1,57 @@
package user_handler
import (
"encoding/json"
"errors"
"fmt"
"github.com/lysand-org/versia-go/internal/validators/val_impls"
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/lysand-org/versia-go/internal/api_schema"
"github.com/lysand-org/versia-go/pkg/lysand"
)
func (i *Handler) LysandInbox(c *fiber.Ctx) error {
if err := i.requestValidator.ValidateFiberCtx(c.UserContext(), c); err != nil {
if errors.Is(err, val_impls.ErrInvalidSignature) {
i.log.Error(err, "Invalid signature")
return c.SendStatus(fiber.StatusUnauthorized)
}
i.log.Error(err, "Failed to validate signature")
return err
}
var raw json.RawMessage
if err := json.Unmarshal(c.Body(), &raw); err != nil {
i.log.Error(err, "Failed to unmarshal inbox object")
return api_schema.ErrBadRequest(nil)
}
obj, err := lysand.ParseInboxObject(raw)
if err != nil {
i.log.Error(err, "Failed to parse inbox object")
if errors.Is(err, lysand.ErrUnknownType{}) {
return api_schema.ErrNotFound(map[string]any{
"error": fmt.Sprintf("Unknown object type: %s", err.(lysand.ErrUnknownType).Type),
})
}
return err
}
userId, err := uuid.Parse(c.Params("id"))
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid user ID",
})
}
if err := i.inboxService.Handle(c.UserContext(), obj, userId); err != nil {
i.log.Error(err, "Failed to handle inbox", "user", userId)
}
return c.SendStatus(fiber.StatusOK)
}

View file

@ -0,0 +1,31 @@
package user_handler
import (
"github.com/gofiber/fiber/v2"
"github.com/google/uuid"
"github.com/lysand-org/versia-go/internal/api_schema"
)
func (i *Handler) GetLysandUser(c *fiber.Ctx) error {
parsedRequestedUserID, err := uuid.Parse(c.Params("id"))
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Invalid user ID",
})
}
u, err := i.userService.GetUserByID(c.UserContext(), parsedRequestedUserID)
if err != nil {
i.log.Error(err, "Failed to query user", "id", parsedRequestedUserID)
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "Failed to query user",
"id": parsedRequestedUserID,
})
}
if u == nil {
return api_schema.ErrNotFound(map[string]any{"id": parsedRequestedUserID})
}
return c.JSON(u.ToLysand())
}

View file

@ -0,0 +1,9 @@
package user_handler
import (
"github.com/gofiber/fiber/v2"
)
func (i *Handler) RobotsTXT(c *fiber.Ctx) error {
return c.SendString("")
}

View file

@ -0,0 +1,32 @@
package user_handler
import (
"github.com/gofiber/fiber/v2"
"github.com/lysand-org/versia-go/config"
"github.com/lysand-org/versia-go/internal/helpers"
"github.com/lysand-org/versia-go/pkg/webfinger"
)
func (i *Handler) Webfinger(c *fiber.Ctx) error {
userID, err := webfinger.ParseResource(c.Query("resource"))
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(webfinger.Response{
Error: helpers.StringPtr(err.Error()),
})
}
if userID.Domain != config.C.PublicAddress.Host {
return c.Status(fiber.StatusNotFound).JSON(webfinger.Response{
Error: helpers.StringPtr("The requested user is a remote user"),
})
}
wf, err := i.userService.GetWebfingerForUser(c.UserContext(), userID.ID)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(webfinger.Response{
Error: helpers.StringPtr("Failed to query user"),
})
}
return c.JSON(wf.WebFingerResource())
}