| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | package folder | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2022-10-28 21:35:49 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/services/user" | 
					
						
							| 
									
										
										
										
											2022-10-28 21:35:49 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util/errutil" | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | var ErrMaximumDepthReached = errutil.NewBase(errutil.StatusBadRequest, "folder.maximum-depth-reached", errutil.WithPublicMessage("Maximum nested folder depth reached")) | 
					
						
							|  |  |  | var ErrBadRequest = errutil.NewBase(errutil.StatusBadRequest, "folder.bad-request") | 
					
						
							|  |  |  | var ErrDatabaseError = errutil.NewBase(errutil.StatusInternal, "folder.database-error") | 
					
						
							|  |  |  | var ErrInternal = errutil.NewBase(errutil.StatusInternal, "folder.internal") | 
					
						
							| 
									
										
										
										
											2022-11-09 03:53:05 +08:00
										 |  |  | var ErrFolderTooDeep = errutil.NewBase(errutil.StatusInternal, "folder.too-deep") | 
					
						
							| 
									
										
										
										
											2022-12-08 21:49:17 +08:00
										 |  |  | var ErrCircularReference = errutil.NewBase(errutil.StatusBadRequest, "folder.circular-reference", errutil.WithPublicMessage("Circular reference detected")) | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	GeneralFolderUID     = "general" | 
					
						
							| 
									
										
										
										
											2022-11-08 21:59:55 +08:00
										 |  |  | 	RootFolderUID        = "" | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	MaxNestedFolderDepth = 8 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-28 21:35:49 +08:00
										 |  |  | var ErrFolderNotFound = errutil.NewBase(errutil.StatusNotFound, "folder.notFound") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | type Folder struct { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	ID          int64  `xorm:"pk autoincr 'id'"` | 
					
						
							|  |  |  | 	OrgID       int64  `xorm:"org_id"` | 
					
						
							|  |  |  | 	UID         string `xorm:"uid"` | 
					
						
							|  |  |  | 	ParentUID   string `xorm:"parent_uid"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	Title       string | 
					
						
							|  |  |  | 	Description string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Created time.Time | 
					
						
							|  |  |  | 	Updated time.Time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-28 20:23:39 +08:00
										 |  |  | 	// TODO: validate if this field is required/relevant to folders.
 | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	// currently there is no such column
 | 
					
						
							| 
									
										
										
										
											2022-11-15 18:58:12 +08:00
										 |  |  | 	Version   int | 
					
						
							| 
									
										
										
										
											2023-01-25 16:14:32 +08:00
										 |  |  | 	URL       string | 
					
						
							| 
									
										
										
										
											2022-11-15 18:58:12 +08:00
										 |  |  | 	UpdatedBy int64 | 
					
						
							|  |  |  | 	CreatedBy int64 | 
					
						
							|  |  |  | 	HasACL    bool | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type FolderDTO struct { | 
					
						
							|  |  |  | 	Folder | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Children []FolderDTO | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NewFolder tales a title and returns a Folder with the Created and Updated
 | 
					
						
							|  |  |  | // fields set to the current time.
 | 
					
						
							|  |  |  | func NewFolder(title string, description string) *Folder { | 
					
						
							|  |  |  | 	return &Folder{ | 
					
						
							|  |  |  | 		Title:       title, | 
					
						
							|  |  |  | 		Description: description, | 
					
						
							|  |  |  | 		Created:     time.Now(), | 
					
						
							|  |  |  | 		Updated:     time.Now(), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // CreateFolderCommand captures the information required by the folder service
 | 
					
						
							|  |  |  | // to create a folder.
 | 
					
						
							|  |  |  | type CreateFolderCommand struct { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	UID         string `json:"uid"` | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 	OrgID       int64  `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	Title       string `json:"title"` | 
					
						
							|  |  |  | 	Description string `json:"description"` | 
					
						
							| 
									
										
										
										
											2022-11-25 02:28:53 +08:00
										 |  |  | 	ParentUID   string `json:"parentUid"` | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // UpdateFolderCommand captures the information required by the folder service
 | 
					
						
							|  |  |  | // to update a folder. Use Move to update a folder's parent folder.
 | 
					
						
							|  |  |  | type UpdateFolderCommand struct { | 
					
						
							| 
									
										
										
										
											2022-12-20 21:00:33 +08:00
										 |  |  | 	UID   string `json:"-"` | 
					
						
							|  |  |  | 	OrgID int64  `json:"-"` | 
					
						
							|  |  |  | 	// NewUID it's an optional parameter used for overriding the existing folder UID
 | 
					
						
							|  |  |  | 	NewUID *string `json:"uid"` // keep same json tag with the legacy command for not breaking the existing APIs
 | 
					
						
							|  |  |  | 	// NewTitle it's an optional parameter used for overriding the existing folder title
 | 
					
						
							|  |  |  | 	NewTitle *string `json:"title"` // keep same json tag with the legacy command for not breaking the existing APIs
 | 
					
						
							|  |  |  | 	// NewDescription it's an optional parameter used for overriding the existing folder description
 | 
					
						
							|  |  |  | 	NewDescription *string `json:"description"` // keep same json tag with the legacy command for not breaking the existing APIs
 | 
					
						
							|  |  |  | 	NewParentUID   *string `json:"-"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Version only used by the legacy folder implementation
 | 
					
						
							|  |  |  | 	Version int `json:"version"` | 
					
						
							|  |  |  | 	// Overwrite only used by the legacy folder implementation
 | 
					
						
							|  |  |  | 	Overwrite bool `json:"overwrite"` | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MoveFolderCommand captures the information required by the folder service
 | 
					
						
							|  |  |  | // to move a folder.
 | 
					
						
							|  |  |  | type MoveFolderCommand struct { | 
					
						
							| 
									
										
										
										
											2023-01-25 23:04:08 +08:00
										 |  |  | 	UID          string `json:"-"` | 
					
						
							|  |  |  | 	NewParentUID string `json:"parentUid"` | 
					
						
							| 
									
										
										
										
											2022-11-10 17:41:03 +08:00
										 |  |  | 	OrgID        int64  `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DeleteFolderCommand captures the information required by the folder service
 | 
					
						
							|  |  |  | // to delete a folder.
 | 
					
						
							|  |  |  | type DeleteFolderCommand struct { | 
					
						
							| 
									
										
										
										
											2022-11-10 16:42:32 +08:00
										 |  |  | 	UID              string `json:"uid" xorm:"uid"` | 
					
						
							|  |  |  | 	OrgID            int64  `json:"orgId" xorm:"org_id"` | 
					
						
							|  |  |  | 	ForceDeleteRules bool   `json:"forceDeleteRules"` | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 23:52:01 +08:00
										 |  |  | // GetFolderQuery is used for all folder Get requests. Only one of UID, ID, or
 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | // Title should be set; if multilpe fields are set by the caller the dashboard
 | 
					
						
							|  |  |  | // service will select the field with the most specificity, in order: ID, UID,
 | 
					
						
							|  |  |  | // Title.
 | 
					
						
							| 
									
										
										
										
											2022-10-26 23:52:01 +08:00
										 |  |  | type GetFolderQuery struct { | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	UID   *string | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	ID    *int64 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	Title *string | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	OrgID int64 | 
					
						
							| 
									
										
										
										
											2022-11-23 17:13:47 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 23:52:01 +08:00
										 |  |  | // GetParentsQuery captures the information required by the folder service to
 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | // return a list of all parent folders of a given folder.
 | 
					
						
							| 
									
										
										
										
											2022-10-26 23:52:01 +08:00
										 |  |  | type GetParentsQuery struct { | 
					
						
							| 
									
										
										
										
											2022-11-03 21:21:41 +08:00
										 |  |  | 	UID   string `xorm:"uid"` | 
					
						
							|  |  |  | 	OrgID int64  `xorm:"org_id"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | // GetChildrenQuery captures the information required by the folder service to
 | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | // return a list of child folders of the given folder.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | type GetChildrenQuery struct { | 
					
						
							| 
									
										
										
										
											2022-10-29 02:07:25 +08:00
										 |  |  | 	UID   string `xorm:"uid"` | 
					
						
							|  |  |  | 	OrgID int64  `xorm:"org_id"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | 	Depth int64 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Pagination options
 | 
					
						
							|  |  |  | 	Limit int64 | 
					
						
							|  |  |  | 	Page  int64 | 
					
						
							| 
									
										
										
										
											2022-12-19 16:52:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser `json:"-"` | 
					
						
							| 
									
										
										
										
											2022-10-26 22:15:14 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-01-25 16:14:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type HasEditPermissionInFoldersQuery struct { | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type HasAdminPermissionInDashboardsOrFoldersQuery struct { | 
					
						
							|  |  |  | 	SignedInUser *user.SignedInUser | 
					
						
							|  |  |  | } |