blob: 2ed0a11fa7141d2c9c73b40cd533a2df9f17f27f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package manager
import (
"fmt"
"github.com/apache/dubbo-admin/pkg/core/resource/model"
"github.com/apache/dubbo-admin/pkg/core/store"
)
type ReadOnlyResourceManager interface {
// GetByKey returns the resource with the given resource key
GetByKey(rk model.ResourceKind, key string) (r model.Resource, exist bool, err error)
// ListByIndexes returns the resources with the given indexes, indexes is a map of index name and index value
ListByIndexes(rk model.ResourceKind, indexes map[string]string) ([]model.Resource, error)
// PageListByIndexes page list the resources with the given indexes, indexes is a map of index name and index value
PageListByIndexes(rk model.ResourceKind, indexes map[string]string, pr model.PageReq) (*model.PageData[model.Resource], error)
// PageSearchResourceByConditions page fuzzy search resource by conditions, conditions cannot be empty
// TODO support multiple conditions
PageSearchResourceByConditions(rk model.ResourceKind, conditions []string, pr model.PageReq) (*model.PageData[model.Resource], error)
}
type WriteOnlyResourceManager interface {
// Add adds the resource
Add(r model.Resource) error
// Update updates the resource
Update(r model.Resource) error
// Upsert upserts the resource
Upsert(r model.Resource) error
// DeleteByKey deletes the resource with the given resource key
DeleteByKey(rk model.ResourceKind, key string) error
}
type ResourceManager interface {
ReadOnlyResourceManager
WriteOnlyResourceManager
}
func NewResourceManager(router store.Router) ResourceManager {
return &resourcesManager{
StoreRouter: router,
}
}
var _ ResourceManager = &resourcesManager{}
type resourcesManager struct {
StoreRouter store.Router
}
func (rm *resourcesManager) GetByKey(rk model.ResourceKind, key string) (r model.Resource, exist bool, err error) {
rs, err := rm.StoreRouter.ResourceKindRoute(rk)
if err != nil {
return nil, false, err
}
item, exist, err := rs.GetByKey(key)
return item.(model.Resource), exist, err
}
func (rm *resourcesManager) ListByIndexes(rk model.ResourceKind, indexes map[string]string) ([]model.Resource, error) {
rs, err := rm.StoreRouter.ResourceKindRoute(rk)
if err != nil {
return nil, err
}
resources, err := rs.ListByIndexes(indexes)
if err != nil {
return nil, err
}
return resources, nil
}
func (rm *resourcesManager) PageListByIndexes(
rk model.ResourceKind,
indexes map[string]string,
pr model.PageReq) (*model.PageData[model.Resource], error) {
rs, err := rm.StoreRouter.ResourceKindRoute(rk)
if err != nil {
return nil, err
}
pageData, err := rs.PageListByIndexes(indexes, pr)
if err != nil {
return nil, err
}
return pageData, nil
}
func (rm *resourcesManager) PageSearchResourceByConditions(rk model.ResourceKind, conditions []string, pr model.PageReq) (*model.PageData[model.Resource], error) {
//TODO implement me
panic("implement me")
}
func (rm *resourcesManager) Add(r model.Resource) error {
rs, err := rm.StoreRouter.ResourceRoute(r)
if err != nil {
return err
}
return rs.Add(r)
}
func (rm *resourcesManager) Update(r model.Resource) error {
rs, err := rm.StoreRouter.ResourceRoute(r)
if err != nil {
return err
}
return rs.Update(r)
}
func (rm *resourcesManager) Upsert(r model.Resource) error {
if _, exists, _ := rm.GetByKey(r.ResourceKind(), r.ResourceKey()); exists {
return rm.Update(r)
} else {
return rm.Add(r)
}
}
func (rm *resourcesManager) DeleteByKey(rk model.ResourceKind, key string) error {
rs, err := rm.StoreRouter.ResourceKindRoute(rk)
if err != nil {
return err
}
r, exists, err := rm.GetByKey(rk, key)
if err != nil {
return fmt.Errorf("failed to get resource %s: %s", key, err)
}
if !exists {
return fmt.Errorf("%s %s does not exist", rk, key)
}
return rs.Delete(r)
}