mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
K8s/Folders: Fix folder create payload (#94273)
* Fix createdBy and updatedBy * Fix refreshing permission cache * Update created time * Fix user identifier parsing
This commit is contained in:
parent
d04dcb3da0
commit
5a9bd1d1cf
@ -3,8 +3,10 @@ package api
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
k8sErrors "k8s.io/apimachinery/pkg/api/errors"
|
||||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -697,6 +699,7 @@ func (fk8s *folderK8sHandler) createFolder(c *contextmodel.ReqContext) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fk8s.accesscontrolService.ClearUserPermissionCache(c.SignedInUser)
|
||||||
folderDTO, err := fk8s.newToFolderDto(c, *out)
|
folderDTO, err := fk8s.newToFolderDto(c, *out)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fk8s.writeError(c, err)
|
fk8s.writeError(c, err)
|
||||||
@ -802,6 +805,18 @@ func (fk8s *folderK8sHandler) newToFolderDto(c *contextmodel.ReqContext, item un
|
|||||||
return dtos.Folder{}, err
|
return dtos.Folder{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toID := func(rawIdentifier string) (int64, error) {
|
||||||
|
parts := strings.Split(rawIdentifier, ":")
|
||||||
|
if len(parts) < 2 {
|
||||||
|
return 0, fmt.Errorf("invalid user identifier")
|
||||||
|
}
|
||||||
|
userID, err := strconv.ParseInt(parts[1], 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("faild to parse user identifier")
|
||||||
|
}
|
||||||
|
return userID, nil
|
||||||
|
}
|
||||||
|
|
||||||
toDTO := func(f *folder.Folder, checkCanView bool) (dtos.Folder, error) {
|
toDTO := func(f *folder.Folder, checkCanView bool) (dtos.Folder, error) {
|
||||||
g, err := guardian.NewByFolder(c.Req.Context(), f, c.SignedInUser.GetOrgID(), c.SignedInUser)
|
g, err := guardian.NewByFolder(c.Req.Context(), f, c.SignedInUser.GetOrgID(), c.SignedInUser)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -815,11 +830,19 @@ func (fk8s *folderK8sHandler) newToFolderDto(c *contextmodel.ReqContext, item un
|
|||||||
|
|
||||||
// Finding creator and last updater of the folder
|
// Finding creator and last updater of the folder
|
||||||
updater, creator := anonString, anonString
|
updater, creator := anonString, anonString
|
||||||
if f.CreatedBy > 0 {
|
if len(fDTO.CreatedBy) > 0 {
|
||||||
creator = fk8s.getUserLogin(ctx, f.CreatedBy)
|
id, err := toID(fDTO.CreatedBy)
|
||||||
|
if err != nil {
|
||||||
|
return dtos.Folder{}, err
|
||||||
|
}
|
||||||
|
creator = fk8s.getUserLogin(ctx, id)
|
||||||
}
|
}
|
||||||
if f.UpdatedBy > 0 {
|
if len(fDTO.UpdatedBy) > 0 {
|
||||||
updater = fk8s.getUserLogin(ctx, f.UpdatedBy)
|
id, err := toID(fDTO.UpdatedBy)
|
||||||
|
if err != nil {
|
||||||
|
return dtos.Folder{}, err
|
||||||
|
}
|
||||||
|
updater = fk8s.getUserLogin(ctx, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
acMetadata, _ := fk8s.getFolderACMetadata(c, f)
|
acMetadata, _ := fk8s.getFolderACMetadata(c, f)
|
||||||
|
@ -82,7 +82,9 @@ func UnstructuredToLegacyFolderDTO(item unstructured.Unstructured) (*dtos.Folder
|
|||||||
// avoid panic
|
// avoid panic
|
||||||
var createdTime time.Time
|
var createdTime time.Time
|
||||||
if created != nil {
|
if created != nil {
|
||||||
createdTime = *created
|
// #TODO Fix this time format. The legacy time format seems to be along the lines of time.Now()
|
||||||
|
// which includes a part that represents a fraction of a second.
|
||||||
|
createdTime = created.Local()
|
||||||
}
|
}
|
||||||
|
|
||||||
dto := &dtos.Folder{
|
dto := &dtos.Folder{
|
||||||
@ -93,20 +95,14 @@ func UnstructuredToLegacyFolderDTO(item unstructured.Unstructured) (*dtos.Folder
|
|||||||
// #TODO add back CreatedBy, UpdatedBy once we figure out how to access userService
|
// #TODO add back CreatedBy, UpdatedBy once we figure out how to access userService
|
||||||
// to translate user ID into user login. meta.GetCreatedBy() only stores user ID
|
// to translate user ID into user login. meta.GetCreatedBy() only stores user ID
|
||||||
// Could convert meta.GetCreatedBy() return value to a struct--id and name
|
// Could convert meta.GetCreatedBy() return value to a struct--id and name
|
||||||
// CreatedBy: meta.GetCreatedBy(),
|
CreatedBy: meta.GetCreatedBy(),
|
||||||
// UpdatedBy: meta.GetCreatedBy(),
|
UpdatedBy: meta.GetCreatedBy(),
|
||||||
URL: getURL(meta, title),
|
URL: getURL(meta, title),
|
||||||
// #TODO get Created in format "2024-09-12T15:37:41.09466+02:00"
|
// #TODO get Created in format "2024-09-12T15:37:41.09466+02:00"
|
||||||
Created: createdTime,
|
Created: createdTime,
|
||||||
// #TODO figure out whether we want to set "updated" and "updated by". Could replace with
|
// #TODO figure out whether we want to set "updated" and "updated by". Could replace with
|
||||||
// meta.GetUpdatedTimestamp() but it currently gets overwritten in prepareObjectForStorage().
|
// meta.GetUpdatedTimestamp() but it currently gets overwritten in prepareObjectForStorage().
|
||||||
Updated: createdTime,
|
Updated: createdTime,
|
||||||
// #TODO figure out how to set these properly
|
|
||||||
CanSave: false,
|
|
||||||
CanEdit: false,
|
|
||||||
CanAdmin: false,
|
|
||||||
CanDelete: false,
|
|
||||||
HasACL: false,
|
|
||||||
|
|
||||||
// #TODO figure out about adding version, parents, orgID fields
|
// #TODO figure out about adding version, parents, orgID fields
|
||||||
}
|
}
|
||||||
@ -141,6 +137,9 @@ func convertToK8sResource(v *folder.Folder, namespacer request.NamespaceMapper)
|
|||||||
Timestamp: &v.Created,
|
Timestamp: &v.Created,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// #TODO: turns out these get overwritten by Unified Storage (see pkg/storage/unified/apistore/prepare.go)
|
||||||
|
// We're going to have to align with that. For now we do need the user ID because the folder type stores it
|
||||||
|
// as the only user identifier
|
||||||
if v.CreatedBy > 0 {
|
if v.CreatedBy > 0 {
|
||||||
meta.SetCreatedBy(fmt.Sprintf("user:%d", v.CreatedBy))
|
meta.SetCreatedBy(fmt.Sprintf("user:%d", v.CreatedBy))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user