feat: 完整游戏运维功能
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"browser.local/platform/domain"
|
||||
)
|
||||
|
||||
func (svc *CoreService) AuthorizePluginBridgeActionForSession(sessionID string, request domain.PluginBridgeAuthorizeRequest) (domain.PluginBridgeAuthorization, error) {
|
||||
if _, err := svc.GetCurrentUser(sessionID); err != nil {
|
||||
return domain.PluginBridgeAuthorization{}, err
|
||||
}
|
||||
if request.ServerInstanceID != "" {
|
||||
if _, err := svc.GetServerInstanceForSession(sessionID, request.ServerInstanceID); err != nil {
|
||||
return domain.PluginBridgeAuthorization{}, err
|
||||
}
|
||||
}
|
||||
return svc.AuthorizePluginBridgeAction(request)
|
||||
}
|
||||
|
||||
func (svc *CoreService) GetJobForSession(sessionID string, id string) (domain.Job, error) {
|
||||
job, err := svc.store.Jobs().Get(id)
|
||||
if err != nil {
|
||||
return domain.Job{}, err
|
||||
}
|
||||
if err := svc.authorizeJobAccess(sessionID, job); err != nil {
|
||||
return domain.Job{}, err
|
||||
}
|
||||
return domain.CopyJob(job), nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) ListJobsForSession(sessionID string, filter domain.JobFilter) ([]domain.Job, error) {
|
||||
user, err := svc.GetCurrentUser(sessionID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if filter.ServerInstanceID != "" {
|
||||
instance, err := svc.store.ServerInstances().Get(filter.ServerInstanceID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !canAccessServer(user, instance) {
|
||||
return nil, ErrForbidden
|
||||
}
|
||||
}
|
||||
jobs, err := svc.store.Jobs().List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if isPlatformAdmin(user) {
|
||||
return jobs, nil
|
||||
}
|
||||
visible := make([]domain.Job, 0, len(jobs))
|
||||
for _, job := range jobs {
|
||||
if job.ServerInstanceID == "" {
|
||||
continue
|
||||
}
|
||||
instance, getErr := svc.store.ServerInstances().Get(job.ServerInstanceID)
|
||||
if getErr == nil && canAccessServer(user, instance) {
|
||||
visible = append(visible, domain.CopyJob(job))
|
||||
}
|
||||
}
|
||||
return visible, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) RequestRunJobCancelForSession(sessionID string, request domain.RunJobCancelRequest) (domain.RunJobCancelRequestResult, error) {
|
||||
job, err := svc.GetJobForSession(sessionID, request.JobID)
|
||||
if err != nil {
|
||||
return domain.RunJobCancelRequestResult{}, err
|
||||
}
|
||||
request.JobID = job.ID
|
||||
return svc.RequestRunJobCancel(request)
|
||||
}
|
||||
|
||||
func (svc *CoreService) ListArtifactsForSession(sessionID string, filter domain.ArtifactFilter) ([]domain.Artifact, error) {
|
||||
if _, err := svc.GetCurrentUser(sessionID); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
artifacts, err := svc.store.Artifacts().List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
visible := make([]domain.Artifact, 0, len(artifacts))
|
||||
for _, artifact := range artifacts {
|
||||
if err := svc.authorizeArtifactAccess(sessionID, artifact); err == nil {
|
||||
visible = append(visible, domain.CopyArtifact(artifact))
|
||||
}
|
||||
}
|
||||
if filter.OwnerID != "" && len(artifacts) > 0 && len(visible) == 0 {
|
||||
return nil, ErrForbidden
|
||||
}
|
||||
return visible, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) GetLogStreamForSession(sessionID string, id string) (domain.LogStream, error) {
|
||||
stream, err := svc.store.LogStreams().Get(id)
|
||||
if err != nil {
|
||||
return domain.LogStream{}, err
|
||||
}
|
||||
if _, err := svc.GetServerInstanceForSession(sessionID, stream.ServerInstanceID); err != nil {
|
||||
return domain.LogStream{}, err
|
||||
}
|
||||
return domain.CopyLogStream(stream), nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) ListLogStreamsForSession(sessionID string, filter domain.LogStreamFilter) ([]domain.LogStream, error) {
|
||||
user, err := svc.GetCurrentUser(sessionID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if filter.ServerInstanceID != "" {
|
||||
instance, err := svc.store.ServerInstances().Get(filter.ServerInstanceID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !canAccessServer(user, instance) {
|
||||
return nil, ErrForbidden
|
||||
}
|
||||
}
|
||||
streams, err := svc.store.LogStreams().List(filter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if isPlatformAdmin(user) {
|
||||
return streams, nil
|
||||
}
|
||||
visible := make([]domain.LogStream, 0, len(streams))
|
||||
for _, stream := range streams {
|
||||
instance, getErr := svc.store.ServerInstances().Get(stream.ServerInstanceID)
|
||||
if getErr == nil && canAccessServer(user, instance) {
|
||||
visible = append(visible, domain.CopyLogStream(stream))
|
||||
}
|
||||
}
|
||||
return visible, nil
|
||||
}
|
||||
|
||||
func (svc *CoreService) QueryLogStreamForSession(sessionID string, query domain.LogStreamCursorQuery) (domain.LogStreamCursorResult, error) {
|
||||
if _, err := svc.GetLogStreamForSession(sessionID, query.LogStreamID); err != nil {
|
||||
return domain.LogStreamCursorResult{}, err
|
||||
}
|
||||
return svc.QueryLogStream(query)
|
||||
}
|
||||
|
||||
func (svc *CoreService) authorizeJobAccess(sessionID string, job domain.Job) error {
|
||||
user, err := svc.GetCurrentUser(sessionID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if job.ServerInstanceID == "" {
|
||||
if !isPlatformAdmin(user) {
|
||||
return ErrForbidden
|
||||
}
|
||||
return nil
|
||||
}
|
||||
instance, err := svc.store.ServerInstances().Get(job.ServerInstanceID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !canAccessServer(user, instance) {
|
||||
return ErrForbidden
|
||||
}
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user