masterServicemdl.go 3.71 KiB
Newer Older
Roshan Patil's avatar
Roshan Patil committed
package routebuildermdl

import (
	"encoding/json"
	"strconv"
	"strings"
	"time"
Roshan Patil's avatar
Roshan Patil committed

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/dalmdl/dao"

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/loggermdl"

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"

	"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/dalmdl/mongodb"

	"github.com/tidwall/gjson"
)

// Master - struct for master Service
type Master struct {
	ServiceName  string
	IsCach       bool
	CacheTime    time.Duration
Roshan Patil's avatar
Roshan Patil committed
	IsRestricted bool
	IsRoleBased  bool
	IsMongo      bool
}

// MongoQuery - for mongo service
type MongoQuery struct {
	Collection string
	Host       string
	Query      string
	Args       []string
}

// FDBQuery - for fdb services
type FDBQuery struct {
	FilePath string
	Query    []string
}

// Runable - helps to run
type Runable struct {
	Master
	MongoQuery
	FDBQuery
}

// MongoService - return mongo query object
func (m *Master) MongoService(collection, query string) *Runable {
	mongo := MongoQuery{
		Collection: collection,
		Query:      query,
	}
	m.IsMongo = true
	runable := &Runable{
		Master:     *m,
		MongoQuery: mongo,
	}
	return runable
}

// MongoServiceWithHost - return mongo query object
func (m *Master) MongoServiceWithHost(host, collection, query string) *Runable {
Roshan Patil's avatar
Roshan Patil committed
	mongo := MongoQuery{
		Host:       host,
		Collection: collection,
		Query:      query,
	}
	m.IsMongo = true
	runable := &Runable{
		Master:     *m,
		MongoQuery: mongo,
	}
	return runable
}

// FDBService - return mongo query object
func (m *Master) FDBService(filPath string, query ...string) *Runable {
	FDB := FDBQuery{
		FilePath: filPath,
		Query:    query,
	}
	runable := &Runable{
		Master:   *m,
		FDBQuery: FDB,
	}
	return runable
}

// IsCachable for both fdb and mongo
func (m *Master) IsCachable() *Master {
	m.IsCach = true
	return m
}

// IsCachableWithExpiration for both fdb and mongo
func (m *Master) IsCachableWithExpiration(cacheExpirationTime time.Duration) *Master {
	m.IsCach = true
	m.CacheTime = cacheExpirationTime
Roshan Patil's avatar
Roshan Patil committed
	return m
}

// SetArgs set argument for query string
func (m *Runable) SetArgs(args ...string) *Runable {
	if m.Master.IsMongo {
		m.MongoQuery.Args = args
	}
	return m
}

// Register - register it in cacahe
func (m *Runable) Register() {
	service := ServiceCache{
		MasterService:   m,
		IsMasterService: true,
	}
	commonServiceRegistration(m.Master.ServiceName, service, m.Master.IsRestricted, m.Master.IsRestricted)
}

// Run - execute and return output and error
func (m *Runable) Run(data []byte) (interface{}, error) {
	if m.Master.IsMongo {
		return m.runMongoService(data)
	}
	return m.runFDBService()
}

func (m *Runable) runMongoService(data []byte) (interface{}, error) {
	rs := gjson.ParseBytes(data)
Roshan Patil's avatar
Roshan Patil committed
	tmp := m.MongoQuery.Query
Roshan Patil's avatar
Roshan Patil committed
	for i, arg := range m.MongoQuery.Args {
		result := rs.Get(arg).String()
		argNotation := "~" + strconv.Itoa(i+1)
Roshan Patil's avatar
Roshan Patil committed
		tmp = strings.Replace(tmp, argNotation, result, 1)
Roshan Patil's avatar
Roshan Patil committed
	}

	var v map[string]interface{}
Roshan Patil's avatar
Roshan Patil committed
	unmarshalError := json.Unmarshal([]byte(tmp), &v)
Roshan Patil's avatar
Roshan Patil committed
	if errormdl.CheckErr(unmarshalError) != nil {
		loggermdl.LogError(unmarshalError)
		return nil, errormdl.CheckErr(unmarshalError)
	}
	query, getError := mongodb.GetMongoDAOWithHost(m.MongoQuery.Host, m.MongoQuery.Collection).GetData(v)
Roshan Patil's avatar
Roshan Patil committed
	if errormdl.CheckErr(getError) != nil {
		loggermdl.LogError(getError)
		return nil, errormdl.CheckErr(getError)
	}
Roshan Patil's avatar
Roshan Patil committed
	return query.Value(), nil
Roshan Patil's avatar
Roshan Patil committed
}

func (m *Runable) runFDBService() (interface{}, error) {
	rs, getError := dalmdl.GetDAO().
		FilePath(m.FDBQuery.FilePath).
		Query(m.FDBQuery.Query...).
		IsCacheableWithDuration(m.Master.CacheTime).
Roshan Patil's avatar
Roshan Patil committed
		Run()
	if errormdl.CheckErr(getError) != nil {
		loggermdl.LogError(getError)
		return nil, errormdl.CheckErr(getError)
	}
	return rs.Value(), nil
}