madipo2611 a5a90bed7e v0.0.1
2025-04-28 15:14:02 +03:00

222 lines
7.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package graph
import (
"context"
"errors"
"github.com/vektah/gqlparser/v2/gqlerror"
"tailly_back_v2/internal/domain"
"tailly_back_v2/internal/service"
)
// Реализуем корневые резолверы
type Resolver struct {
services *service.Services
}
// Ensure все интерфейсы реализованы
var _ domain.QueryResolver = (*Resolver)(nil)
var _ domain.MutationResolver = (*Resolver)(nil)
func NewResolver(services *service.Services) *Resolver {
return &Resolver{services: services}
}
// ChatSession returns ChatSessionResolver implementation.
func (r *Resolver) ChatSession() ChatSessionResolver { return &chatSessionResolver{r} }
// Comment returns CommentResolver implementation.
func (r *Resolver) Comment() CommentResolver { return &commentResolver{r} }
// Like returns LikeResolver implementation.
func (r *Resolver) Like() LikeResolver { return &likeResolver{r} }
// Message returns MessageResolver implementation.
func (r *Resolver) Message() MessageResolver { return &messageResolver{r} }
// Mutation returns MutationResolver implementation.
func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} }
// Post returns PostResolver implementation.
func (r *Resolver) Post() PostResolver { return &postResolver{r} }
// Query returns QueryResolver implementation.
func (r *Resolver) Query() QueryResolver { return &queryResolver{r} }
// Subscription returns SubscriptionResolver implementation.
func (r *Resolver) Subscription() SubscriptionResolver { return &subscriptionResolver{r} }
// User returns UserResolver implementation.
func (r *Resolver) User() UserResolver { return &userResolver{r} }
// Query resolvers
func (r *Resolver) Me(ctx context.Context) (*domain.User, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return nil, err
}
return r.services.User.GetByID(ctx, userID)
}
func (r *Resolver) Posts(ctx context.Context) ([]*domain.Post, error) {
return r.services.Post.GetAll(ctx)
}
// Mutation resolvers
func (r *Resolver) Register(ctx context.Context, input domain.RegisterInput) (*domain.User, error) {
return r.services.Auth.Register(ctx, service.RegisterInput{
Username: input.Username,
Email: input.Email,
Password: input.Password,
})
}
func (r *Resolver) Login(ctx context.Context, input domain.LoginInput) (*domain.Tokens, error) {
return r.services.Auth.Login(ctx, input.Email, input.Password)
}
// mutationResolver реализует MutationResolver интерфейс
type mutationResolver struct{ *Resolver }
// Register is the resolver for the register field.
func (r *mutationResolver) Register(ctx context.Context, input domain.RegisterInput) (*domain.User, error) {
return r.services.Auth.Register(ctx, service.RegisterInput(input))
}
// Login is the resolver for the login field.
func (r *mutationResolver) Login(ctx context.Context, input domain.LoginInput) (*domain.Tokens, error) {
return r.services.Auth.Login(ctx, input.Email, input.Password)
}
// RefreshTokens is the resolver for the refreshTokens field.
func (r *mutationResolver) RefreshTokens(ctx context.Context, refreshToken string) (*domain.Tokens, error) {
return r.services.Auth.RefreshTokens(ctx, refreshToken)
}
// CreatePost is the resolver for the createPost field.
func (r *mutationResolver) CreatePost(ctx context.Context, title string, content string) (*domain.Post, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return nil, err
}
return r.services.Post.Create(ctx, userID, title, content)
}
// CreateComment is the resolver for the createComment field.
func (r *mutationResolver) CreateComment(ctx context.Context, postID string, content string) (*domain.Comment, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return nil, err
}
return r.services.Comment.Create(ctx, postID, userID, content)
}
// Mutation: likePost - добавление лайка к посту
func (r *mutationResolver) LikePost(ctx context.Context, postID string) (*domain.Like, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return nil, err
}
// Проверяем, не поставил ли пользователь уже лайк
liked, err := r.services.Like.CheckIfLiked(ctx, userID, postID)
if err != nil {
return nil, err
}
if liked {
return nil, gqlerror.Errorf("you have already liked this post")
}
return r.services.Like.LikePost(ctx, userID, postID)
}
// Mutation: unlikePost - удаление лайка с поста
func (r *mutationResolver) UnlikePost(ctx context.Context, postID string) (bool, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return false, err
}
// Проверяем, ставил ли пользователь лайк
liked, err := r.services.Like.CheckIfLiked(ctx, userID, postID)
if err != nil {
return false, err
}
if !liked {
return false, gqlerror.Errorf("you haven't liked this post yet")
}
if err := r.services.Like.UnlikePost(ctx, userID, postID); err != nil {
return false, err
}
return true, nil
}
// Mutation.changePassword - смена пароля
func (r *mutationResolver) ChangePassword(ctx context.Context, oldPassword string, newPassword string) (bool, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return false, err
}
if err := r.services.User.ChangePassword(ctx, userID, oldPassword, newPassword); err != nil {
return false, err
}
return true, nil
}
// SendMessage is the resolver for the sendMessage field.
func (r *mutationResolver) SendMessage(ctx context.Context, receiverID string, content string) (*domain.Message, error) {
panic("not implemented")
}
// MarkAsRead is the resolver for the markAsRead field.
func (r *mutationResolver) MarkAsRead(ctx context.Context, messageID string) (bool, error) {
panic("not implemented")
}
// queryResolver реализует QueryResolver интерфейс
type queryResolver struct{ *Resolver }
// Me is the resolver for the me field.
func (r *queryResolver) Me(ctx context.Context) (*domain.User, error) {
userID, err := getUserIDFromContext(ctx)
if err != nil {
return nil, err
}
return r.services.User.GetByID(ctx, userID)
}
// Post is the resolver for the post field.
func (r *queryResolver) Post(ctx context.Context, id string) (*domain.Post, error) {
return r.services.Post.GetByID(ctx, id)
}
// Posts is the resolver for the posts field.
func (r *queryResolver) Posts(ctx context.Context) ([]*domain.Post, error) {
return r.services.Post.GetAll(ctx)
}
// GetChatHistory is the resolver for the getChatHistory field.
func (r *queryResolver) GetChatHistory(ctx context.Context, userID string) ([]*domain.Message, error) {
panic("not implemented")
}
// GetUserChats is the resolver for the getUserChats field.
func (r *queryResolver) GetUserChats(ctx context.Context) ([]*domain.ChatSession, error) {
panic("not implemented")
}
// getUserIDFromContext извлекает userID из контекста
func getUserIDFromContext(ctx context.Context) (int, error) {
userID, ok := ctx.Value("userID").(int)
if !ok {
return 0, errors.New("unauthorized")
}
return userID, nil
}