package projectinstance import "context" // TerminateInput 受控终止输入。 type TerminateInput struct { Reason string `json:"reason"` Confirm bool `json:"confirm"` ExpectedConfigRevision int `json:"expected_config_revision"` } // TerminateResult 终止结果。 type TerminateResult struct { Instance WorkflowInstance `json:"instance"` Reason string `json:"reason"` } func (s *Service) TerminateInstance(ctx context.Context, instanceID int64, projectID int64, userID int64, isCreator bool, in TerminateInput) (*TerminateResult, error) { if !isCreator { return nil, ErrForbiddenNotCreator } if !in.Confirm { return nil, ErrTerminationNotAllowed } if in.Reason == "" { return nil, ErrValidationFailed } if !s.Available() { return nil, ErrNotAvailable } live, err := s.store.GetLiveInstance(ctx, projectID) if err != nil || live == nil || live.ID != instanceID { return nil, ErrInstanceNotFound } if in.ExpectedConfigRevision > 0 && live.ConfigRevision != in.ExpectedConfigRevision { return nil, ErrInstanceRevisionConflict } inst, err := s.store.TerminateInstance(ctx, instanceID, projectID, userID, in.Reason) if err != nil { return nil, err } return &TerminateResult{Instance: *inst, Reason: in.Reason}, nil }