222 lines
7.0 KiB
Go
222 lines
7.0 KiB
Go
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
|
||
}
|