Ctrl K
ComunidadGuías…

internal/task/task_auth_service.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package task

import (
	"errors"
	"time"

	"github.com/yeomyeonggeori/blueclaw/internal/auth"
)

type TaskAuthService struct {
	magicLinkService *auth.MagicLinkService
	sessionService   *auth.SessionService
	taskRunService   *TaskRunService
}

func NewTaskAuthService(magicLinkService *auth.MagicLinkService, sessionService *auth.SessionService, taskRunService *TaskRunService) *TaskAuthService {
	return &TaskAuthService{
		magicLinkService: magicLinkService,
		sessionService:   sessionService,
		taskRunService:   taskRunService,
	}
}

func (taskAuthService *TaskAuthService) IssueMagicLink(personID string, taskRunID string) (string, error) {
	return taskAuthService.magicLinkService.IssueMagicLink(personID, taskRunID, 15*time.Minute)
}

func (taskAuthService *TaskAuthService) ConsumeMagicLink(token string) (TaskSession, error) {
	magicLink, isFound := taskAuthService.magicLinkService.ConsumeMagicLink(token)
	if !isFound {
		return TaskSession{}, errors.New("magic link is invalid")
	}

	session, errorValue := taskAuthService.sessionService.CreateSession(magicLink.PersonID, 8*time.Hour)
	if errorValue != nil {
		return TaskSession{}, errorValue
	}

	return TaskSession{
		TaskSessionID: session.SessionID,
		PersonID:      session.PersonID,
		ExpiresAt:     session.ExpiresAt,
	}, nil
}

func (taskAuthService *TaskAuthService) CreateTaskSession(personID string) (TaskSession, error) {
	session, errorValue := taskAuthService.sessionService.CreateSession(personID, 8*time.Hour)
	if errorValue != nil {
		return TaskSession{}, errorValue
	}

	return TaskSession{
		TaskSessionID: session.SessionID,
		PersonID:      session.PersonID,
		ExpiresAt:     session.ExpiresAt,
	}, nil
}

func (taskAuthService *TaskAuthService) AuthorizeTaskAccess(taskSessionID string, taskRunID string) (TaskRun, error) {
	session, isFound := taskAuthService.sessionService.ResolveSession(taskSessionID)
	if !isFound {
		return TaskRun{}, errors.New("task session is invalid")
	}

	taskRun, isFound := taskAuthService.taskRunService.FindTaskRun(taskRunID)
	if !isFound {
		return TaskRun{}, errors.New("task run not found")
	}
	if taskRun.RequesterPersonID != session.PersonID {
		return TaskRun{}, errors.New("task run access denied")
	}

	return taskRun, nil
}

func (taskAuthService *TaskAuthService) ResolveTaskSession(taskSessionID string) (TaskSession, error) {
	session, isFound := taskAuthService.sessionService.ResolveSession(taskSessionID)
	if !isFound {
		return TaskSession{}, errors.New("task session is invalid")
	}

	return TaskSession{
		TaskSessionID: session.SessionID,
		PersonID:      session.PersonID,
		ExpiresAt:     session.ExpiresAt,
	}, nil
}