blob: a2d663d4aec14cad6bf1ca5d11b88458d92f61a9 [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 util
import (
"context"
"github.com/go-chassis/cari/discovery"
"github.com/go-chassis/cari/rbac"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/x/bsonx"
"github.com/apache/servicecomb-service-center/datasource"
"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
"github.com/apache/servicecomb-service-center/pkg/util"
)
type Option func(filter bson.M)
func Domain(domain string) Option {
return func(filter bson.M) {
filter[model.ColumnDomain] = domain
}
}
func Project(project string) Option {
return func(filter bson.M) {
filter[model.ColumnProject] = project
}
}
func AccountName(name interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnAccountName] = name
}
}
func Password(password string) Option {
return func(filter bson.M) {
filter[model.ColumnPassword] = password
}
}
func Roles(roles []string) Option {
return func(filter bson.M) {
filter[model.ColumnRoles] = roles
}
}
func TokenExpirationTime(tokenExpirationTime string) Option {
return func(filter bson.M) {
filter[model.ColumnTokenExpirationTime] = tokenExpirationTime
}
}
func CurrentPassword(password string) Option {
return func(filter bson.M) {
filter[model.ColumnCurrentPassword] = password
}
}
func Status(status string) Option {
return func(filter bson.M) {
filter[model.ColumnStatus] = status
}
}
func ID(id string) Option {
return func(filter bson.M) {
filter[model.ColumnID] = id
}
}
func RoleName(name string) Option {
return func(filter bson.M) {
filter[model.ColumnRoleName] = name
}
}
func Perms(perms []*rbac.Permission) Option {
return func(filter bson.M) {
filter[model.ColumnPerms] = perms
}
}
func AccountUpdateTime(dt interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnAccountUpdateTime] = dt
}
}
func RoleUpdateTime(dt interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnRoleUpdateTime] = dt
}
}
func AccountLockKey(key interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnAccountLockKey] = key
}
}
func AccountLockStatus(status interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnAccountLockStatus] = status
}
}
func AccountLockReleaseAt(releaseAt interface{}) Option {
return func(filter bson.M) {
filter[model.ColumnAccountLockReleaseAt] = releaseAt
}
}
func In(data interface{}) Option {
return func(filter bson.M) {
filter["$in"] = data
}
}
func NotIn(data interface{}) Option {
return func(filter bson.M) {
filter["$nin"] = data
}
}
func Set(data interface{}) Option {
return func(filter bson.M) {
filter["$set"] = data
}
}
func Nor(options ...Option) Option {
return func(filter bson.M) {
filter["$nor"] = bson.A{NewFilter(options...)}
}
}
func Or(options ...Option) Option {
return func(filter bson.M) {
var conditions bson.A
for _, option := range options {
conditions = append(conditions, NewFilter(option))
}
filter["$or"] = conditions
}
}
func NewFilter(options ...Option) bson.M {
filter := bson.M{}
for _, option := range options {
option(filter)
}
return filter
}
func NewDomainProjectFilter(domain string, project string, options ...func(filter bson.M)) bson.M {
filter := bson.M{
model.ColumnDomain: domain,
model.ColumnProject: project,
}
for _, option := range options {
option(filter)
}
return filter
}
func NewBasicFilter(ctx context.Context, options ...func(filter bson.M)) bson.M {
domain := util.ParseDomain(ctx)
project := util.ParseProject(ctx)
filter := bson.M{
model.ColumnDomain: domain,
model.ColumnProject: project,
}
for _, option := range options {
option(filter)
}
return filter
}
func InstanceServiceID(serviceID interface{}) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID})] = serviceID
}
}
func InstanceInstanceID(instanceID string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnInstanceID})] = instanceID
}
}
// ServiceServiceID serviceID can be string or bson.M
func ServiceServiceID(serviceID interface{}) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnServiceID})] = serviceID
}
}
func ServiceEnv(env string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnEnv})] = env
}
}
func ServiceAppID(appID string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnAppID})] = appID
}
}
func ServiceModTime(modTime string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnModTime})] = modTime
}
}
func ServiceProperty(property map[string]string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnProperty})] = property
}
}
func ServiceServiceName(serviceName interface{}) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnServiceName})] = serviceName
}
}
func ServiceID(serviceID string) Option {
return func(filter bson.M) {
filter[model.ColumnServiceID] = serviceID
}
}
func ServiceAlias(alias string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnAlias})] = alias
}
}
func ServiceSchemas(schemas []string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnSchemas})] = schemas
}
}
func ServiceVersion(version interface{}) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = version
}
}
func ServiceType(serviceType string) Option {
return func(filter bson.M) {
filter[model.ColumnServiceType] = serviceType
}
}
func ServiceKeyTenant(tenant string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnTenant})] = tenant
}
}
func ServiceKeyAppID(appID string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnAppID})] = appID
}
}
func ServiceKeyServiceName(serviceName string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnServiceName})] = serviceName
}
}
func ServiceKeyServiceEnv(env string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnEnv})] = env
}
}
func ServiceKeyServiceVersion(version string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnVersion})] = version
}
}
func Schema(schema string) Option {
return func(filter bson.M) {
filter[model.ColumnSchema] = schema
}
}
func SchemaID(schemaID string) Option {
return func(filter bson.M) {
filter[model.ColumnSchemaID] = schemaID
}
}
func SchemaSummary(schemaSummary string) Option {
return func(filter bson.M) {
filter[model.ColumnSchemaSummary] = schemaSummary
}
}
func Tags(tags map[string]string) Option {
return func(filter bson.M) {
filter[model.ColumnTag] = tags
}
}
func Instance(instance *discovery.MicroServiceInstance) Option {
return func(filter bson.M) {
filter[model.ColumnInstance] = instance
}
}
func InstanceModTime(modTime string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnModTime})] = modTime
}
}
func InstanceStatus(status string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnStatus})] = status
}
}
func InstanceProperties(properties map[string]string) Option {
return func(filter bson.M) {
filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnProperty})] = properties
}
}
func BuildIndexDoc(keys ...string) mongo.IndexModel {
keysDoc := bsonx.Doc{}
for _, key := range keys {
keysDoc = keysDoc.Append(key, bsonx.Int32(1))
}
index := mongo.IndexModel{
Keys: keysDoc,
}
return index
}
func NotGlobal() Option {
var names []string
for name := range datasource.GlobalServiceNames {
names = append(names, name)
}
inFilter := NewFilter(In(names))
return Nor(
Domain(datasource.RegistryDomain),
Project(datasource.RegistryProject),
ServiceAppID(datasource.RegistryAppID),
ServiceServiceName(inFilter),
)
}
func Global() Option {
var names []string
for name := range datasource.GlobalServiceNames {
names = append(names, name)
}
inFilter := NewFilter(In(names))
options := []Option{
Domain(datasource.RegistryDomain),
Project(datasource.RegistryProject),
ServiceAppID(datasource.RegistryAppID),
ServiceServiceName(inFilter),
}
return func(filter bson.M) {
for _, option := range options {
option(filter)
}
}
}