Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
MKCLOS
Core Development Platform
corepkgv2
Commits
5ee216b1
There was an error fetching the commit references. Please try again later.
Commit
5ee216b1
authored
6 years ago
by
Roshan Patil
Browse files
Options
Downloads
Patches
Plain Diff
Statemdl + router versioning
parent
b193666e
1 merge request
!59
Statemdl + router versioning
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
dalmdl/fdb/fdb.go
+3
-1
dalmdl/fdb/fdb.go
routebuildermdl/masterServicemdl_test.go
+28
-37
routebuildermdl/masterServicemdl_test.go
routebuildermdl/routebuildermdl.go
+35
-3
routebuildermdl/routebuildermdl.go
routebuildermdl/serviceCachemdl.go
+30
-36
routebuildermdl/serviceCachemdl.go
routebuildermdl/serviceCachemdl_test.go
+36
-0
routebuildermdl/serviceCachemdl_test.go
statemdl/state.go
+85
-13
statemdl/state.go
testingdata/testData/config/config.toml
+4
-4
testingdata/testData/config/config.toml
testingdata/users.json
+578
-64
testingdata/users.json
with
799 additions
and
158 deletions
dalmdl/fdb/fdb.go
+
3
−
1
View file @
5ee216b1
...
...
@@ -9,6 +9,8 @@ import (
"sync"
"time"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/statemdl"
"github.com/pquerna/ffjson/ffjson"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/hashmdl"
...
...
@@ -56,8 +58,8 @@ func GetDataDAO(filePath, query string, isCachable bool, cacheTime time.Duration
return
rs
,
nil
}
if
isCachable
{
data
,
found
:=
Fastcache
.
Get
(
filePath
+
query
)
go
statemdl
.
UpdateGlobalServiceCacheState
(
found
)
if
errormdl
.
CheckBool
(
found
)
{
val
,
ok
:=
data
.
(
gjson
.
Result
)
if
errormdl
.
CheckBool1
(
ok
)
{
...
...
This diff is collapsed.
Click to expand it.
routebuildermdl/masterServicemdl_test.go
+
28
−
37
View file @
5ee216b1
package
routebuildermdl
import
(
"fmt"
"testing"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/dalmdl/mongodb"
"github.com/stretchr/testify/assert"
)
func
TestRunable_Run
(
t
*
testing
.
T
)
{
err
:=
mongodb
.
Init
(
"../testingdata/testData/config/config.toml"
,
"host1"
)
assert
.
NoError
(
t
,
err
)
query
:=
`{"name": "~1", "age": ~2}`
input
:=
`{"name": "roshan", "age": 23}`
run
:=
RegisterMasterService
(
"serviceName"
,
true
,
false
)
.
IsCachable
()
.
MongoService
(
"test"
,
query
)
.
SetArgs
(
"name"
,
"age"
)
result
,
err
:=
run
.
Run
([]
byte
(
input
))
fmt
.
Println
(
result
)
assert
.
NotNil
(
t
,
result
)
assert
.
NoError
(
t
,
err
)
}
func
TestFDB_Run
(
t
*
testing
.
T
)
{
path
:=
"../testingdata/users.json"
run
:=
RegisterMasterService
(
"serviceName"
,
true
,
false
)
.
IsCachableWithExpiration
(
1000
)
.
FDBService
(
path
,
"*"
)
result
,
err
:=
run
.
Run
(
nil
)
fmt
.
Println
(
result
)
assert
.
NotNil
(
t
,
result
)
assert
.
NoError
(
t
,
err
)
}
// func TestRunable_Run(t *testing.T) {
// err := mongodb.Init("../testingdata/testData/config/config.toml", "host1")
// assert.NoError(t, err)
// query := `{"name": "~1", "age": ~2}`
// input := `{"name": "roshan", "age": 23}`
// run := RegisterMasterService("serviceName", true, false).
// IsCachable().
// MongoService("test", query).
// SetArgs("name", "age")
// result, err := run.Run([]byte(input))
// fmt.Println(result)
// assert.NotNil(t, result)
// assert.NoError(t, err)
// }
// func TestFDB_Run(t *testing.T) {
// path := "../testingdata/users.json"
// run := RegisterMasterService("serviceName", true, false).
// IsCachableWithExpiration(1000).
// FDBService(path, "*")
// result, err := run.Run(nil)
// fmt.Println(result)
// assert.NotNil(t, result)
// assert.NoError(t, err)
// }
This diff is collapsed.
Click to expand it.
routebuildermdl/routebuildermdl.go
+
35
−
3
View file @
5ee216b1
...
...
@@ -7,6 +7,8 @@ import (
"strings"
"time"
"github.com/hashicorp/go-version"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/statemdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/authmdl/roleenforcemdl"
...
...
@@ -26,7 +28,7 @@ import (
func
Init
(
o
,
r
,
c
*
gin
.
RouterGroup
,
JWTKey
string
)
{
o
.
POST
(
"/mql"
,
OpenHandler
)
o
.
POST
(
"/mql/login"
,
loginHandler
)
o
.
POST
(
"/mqlstate"
,
statemdl
.
StateHandler
)
o
.
POST
(
"/mql
/
state"
,
statemdl
.
StateHandler
)
r
.
POST
(
"/mql"
,
RestrictedHandler
)
c
.
POST
(
"/mql"
,
RoleBasedHandler
)
jwtmdl
.
GlobalJWTKey
=
JWTKey
...
...
@@ -83,14 +85,18 @@ func executeService(name string, data []byte, isForm bool, formData *multipart.F
}
servingTime
:=
time
.
Since
(
start
)
// Record State for every service
go
statemdl
.
UpdateServiceState
(
name
,
servingTime
,
serviceError
)
go
statemdl
.
UpdateServiceState
(
name
,
servingTime
,
serviceError
,
isRestricted
,
isRoleBased
)
return
result
,
serviceError
}
func
commonHandler
(
c
*
gin
.
Context
,
isRestricted
,
isRoleBased
bool
,
principalObj
servicebuildermdl
.
Principal
)
{
service
:=
c
.
Request
.
Header
.
Get
(
"Service-Header"
)
header
:=
c
.
Request
.
Header
.
Get
(
"Content-Type"
)
versionError
:=
appVersioning
(
c
)
if
versionError
!=
nil
{
c
.
JSON
(
http
.
StatusExpectationFailed
,
versionError
.
Error
())
return
}
responseDataObj
:=
setResponseHeader
(
service
)
if
isMultipartRequest
(
header
)
{
...
...
@@ -227,3 +233,29 @@ func loginHandler(c *gin.Context) {
c
.
Header
(
"Authorization"
,
token
)
c
.
JSON
(
http
.
StatusOK
,
data
)
}
func
appVersioning
(
c
*
gin
.
Context
)
error
{
if
isAppVersionEnabled
{
appVersion
:=
c
.
Request
.
Header
.
Get
(
"app-version"
)
if
appVersion
==
""
{
return
errormdl
.
Wrap
(
"No App version Found in request header"
)
}
ver
,
err
:=
version
.
NewVersion
(
appVersion
)
if
errormdl
.
CheckErr
(
err
)
!=
nil
{
return
errormdl
.
CheckErr
(
err
)
}
if
isStrictMode
{
if
!
ver
.
Equal
(
applicationVersion
)
{
return
errormdl
.
Wrap
(
"Application version mismatched"
)
}
}
else
{
if
ver
.
GreaterThan
(
applicationVersion
)
{
return
errormdl
.
Wrap
(
"Server Version is outdated"
)
}
if
ver
.
LessThan
(
minimumSupportedVersion
)
{
return
errormdl
.
Wrap
(
"Client Version is outdated"
)
}
}
}
return
nil
}
This diff is collapsed.
Click to expand it.
routebuildermdl/serviceCachemdl.go
+
30
−
36
View file @
5ee216b1
package
routebuildermdl
import
(
"bytes"
"fmt"
"mime/multipart"
"strings"
"time"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/servicebuildermdl"
"github.com/hashicorp/go-version"
"github.com/tidwall/gjson"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/errormdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/filemdl"
"corelab.mkcl.org/MKCLOS/coredevelopmentplatform/corepkgv2/cachemdl"
)
const
(
// EXPORT :- js export
EXPORT
=
"export"
// CONSTT :- js const
CONSTT
=
"const"
open
=
"O_"
restricted
=
"R_"
acl
=
"C_"
)
var
(
restrictedServices
cachemdl
.
FastCacheHelper
roleBasedServices
cachemdl
.
FastCacheHelper
openServices
cachemdl
.
FastCacheHelper
loginService
func
(
*
gjson
.
Result
,
servicebuildermdl
.
Principal
)
(
interface
{},
string
,
error
)
var
restrictedServices
cachemdl
.
FastCacheHelper
var
roleBasedServices
cachemdl
.
FastCacheHelper
var
openServices
cachemdl
.
FastCacheHelper
var
loginService
func
(
*
gjson
.
Result
,
servicebuildermdl
.
Principal
)
(
interface
{},
string
,
error
)
applicationVersion
*
version
.
Version
minimumSupportedVersion
*
version
.
Version
isAppVersionEnabled
bool
isStrictMode
bool
)
func
init
()
{
restrictedServices
.
Setup
(
10
,
time
.
Second
*
600
,
time
.
Second
*
600
)
...
...
@@ -101,25 +93,27 @@ func commonServiceRegistration(serviceName string, service ServiceCache, isRestr
}
}
func
createServiceJS
(
rs
*
gjson
.
Result
,
principalObj
servicebuildermdl
.
Principal
)
(
interface
{},
error
)
{
buf
:=
new
(
bytes
.
Buffer
)
// SetAppVersion -SetAppVersion
func
SetAppVersion
(
appVersion
,
minSupportedVersion
string
)
error
{
for
k
:=
range
openServices
.
FastCache
.
Items
()
{
srv
:=
EXPORT
+
" "
+
CONSTT
+
" "
+
open
+
strings
.
ToUpper
(
k
)
+
" = 'O."
+
k
+
"'"
buf
.
WriteString
(
fmt
.
Sprintln
(
srv
)
)
app
,
err
:=
version
.
NewVersion
(
appVersion
)
if
errormdl
.
CheckErr
(
err
)
!=
nil
{
return
errormdl
.
CheckErr
(
err
)
}
for
k
:=
range
restrictedServices
.
FastCache
.
Items
()
{
srv
:=
EXPORT
+
" "
+
CONSTT
+
" "
+
restricted
+
strings
.
ToUpper
(
k
)
+
" = 'R."
+
k
+
"'"
buf
.
WriteString
(
fmt
.
Sprintln
(
srv
))
}
for
k
:=
range
roleBasedServices
.
FastCache
.
Items
()
{
srv
:=
EXPORT
+
" "
+
CONSTT
+
" "
+
acl
+
strings
.
ToUpper
(
k
)
+
" = 'C."
+
k
+
"'"
buf
.
WriteString
(
fmt
.
Sprintln
(
srv
))
min
,
err
:=
version
.
NewVersion
(
minSupportedVersion
)
if
errormdl
.
CheckErr
(
err
)
!=
nil
{
return
errormdl
.
CheckErr
(
err
)
}
saveError
:=
filemdl
.
GetInstance
()
.
Save
(
"./services.js"
,
buf
.
Bytes
(),
true
,
false
)
if
errormdl
.
CheckErr
(
saveError
)
!=
nil
{
return
nil
,
errormdl
.
CheckErr
(
saveError
)
versionValidation
:=
min
.
Compare
(
app
)
if
versionValidation
==
1
{
return
errormdl
.
Wrap
(
"Minimum version is more than app version"
)
}
if
versionValidation
==
0
{
isStrictMode
=
true
}
return
"success"
,
nil
applicationVersion
=
app
minimumSupportedVersion
=
min
isAppVersionEnabled
=
true
return
nil
}
This diff is collapsed.
Click to expand it.
routebuildermdl/serviceCachemdl_test.go
0 → 100644
+
36
−
0
View file @
5ee216b1
package
routebuildermdl
import
(
"testing"
"github.com/stretchr/testify/assert"
)
func
TestSetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
"1.0.1"
,
"1.0.0"
)
assert
.
NoError
(
t
,
err
)
}
func
Test1SetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
"1.0.1"
,
"1.0.1"
)
assert
.
NoError
(
t
,
err
)
}
func
Test2SetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
"1.0"
,
"1.0.1"
)
assert
.
Error
(
t
,
err
)
}
func
Test3SetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
""
,
"1.0.1"
)
assert
.
Error
(
t
,
err
)
}
func
Test4SetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
"1.0.1"
,
"2.0.1"
)
assert
.
Error
(
t
,
err
)
}
func
Test5SetAppVersion
(
t
*
testing
.
T
)
{
err
:=
SetAppVersion
(
"1.0.1"
,
""
)
assert
.
Error
(
t
,
err
)
}
This diff is collapsed.
Click to expand it.
statemdl/state.go
+
85
−
13
View file @
5ee216b1
...
...
@@ -10,14 +10,22 @@ import (
// Statistic - for app application
type
Statistic
struct
{
ServiceName
string
`json:"serviceName"`
TotalHits
int
`json:"totalHits"`
MaxTime
time
.
Duration
`json:"maxTime"`
MinTime
time
.
Duration
`json:"minTime"`
TotalTime
time
.
Duration
`json:"totalTime"`
ErrorCount
int
`json:"errorCount"`
LastError
string
`json:"lastError"`
Description
string
`json:"description"`
ServiceName
string
`json:"serviceName"`
TotalHits
int
`json:"totalHits"`
MaxTime
time
.
Duration
`json:"maxTime"`
MinTime
time
.
Duration
`json:"minTime"`
TotalTime
time
.
Duration
`json:"totalTime"`
ErrorCount
int
`json:"errorCount"`
ErrorTime
*
time
.
Time
`json:"errorTime"`
LastError
string
`json:"lastError"`
Description
string
`json:"description"`
IsRestricted
bool
`json:"isRestricted"`
IsRoleBased
bool
`json:"isRoleBased"`
}
type
groupResponse
struct
{
GroupTime
string
`json:"name"`
Hits
int64
`json:"hits"`
}
type
clientResponse
struct
{
...
...
@@ -26,6 +34,7 @@ type clientResponse struct {
CacheHits
int64
`json:"cacheHits"`
CacheMiss
int64
`json:"cacheMiss"`
StartTime
time
.
Time
`json:"startTime"`
GroupReport
[]
groupResponse
`json:"groupReport"`
}
type
cacheStates
struct
{
totalHits
int64
...
...
@@ -38,6 +47,14 @@ var stateCache map[string]Statistic
var
stateMutex
=
&
sync
.
Mutex
{}
var
cacheStatistic
*
cacheStates
var
groupName
[]
int64
var
groupHits
[]
int64
var
groupMutex
=
&
sync
.
Mutex
{}
var
currentGroup
int64
var
nextGroup
int64
var
nextTime
=
time
.
Second
*
60
// serverStartTime - server start time
var
serverStartTime
time
.
Time
...
...
@@ -47,40 +64,68 @@ func init() {
}
serverStartTime
=
time
.
Now
()
stateCache
=
make
(
map
[
string
]
Statistic
)
current
:=
time
.
Now
()
groupName
=
append
(
groupName
,
current
.
Unix
())
groupHits
=
append
(
groupHits
,
0
)
currentGroup
=
current
.
Unix
()
nextGroup
=
current
.
Add
(
nextTime
)
.
Unix
()
}
func
updateGlobalHit
()
{
cacheStatistic
.
cacheHitsMutex
.
Lock
()
updateGroupCache
(
cacheStatistic
.
totalHits
)
cacheStatistic
.
totalHits
++
cacheStatistic
.
cacheHitsMutex
.
Unlock
()
}
func
updateGroupCache
(
hitCount
int64
)
{
groupMutex
.
Lock
()
current
:=
time
.
Now
()
if
current
.
Unix
()
<
nextGroup
{
for
i
:=
0
;
i
<
len
(
groupName
);
i
++
{
if
groupName
[
i
]
==
currentGroup
{
groupHits
[
i
]
++
}
}
}
else
{
groupName
=
append
(
groupName
,
nextGroup
)
groupHits
=
append
(
groupHits
,
1
)
currentGroup
=
nextGroup
nextGroup
=
current
.
Add
(
nextTime
)
.
Unix
()
}
groupMutex
.
Unlock
()
}
// UpdateServiceState - update entry of service in state map
func
UpdateServiceState
(
serviceName
string
,
servingTime
time
.
Duration
,
serviceError
error
)
{
func
UpdateServiceState
(
serviceName
string
,
servingTime
time
.
Duration
,
serviceError
error
,
isRestricted
,
isRoleBased
bool
)
{
stateMutex
.
Lock
()
defer
stateMutex
.
Unlock
()
serviceState
,
ok
:=
stateCache
[
serviceName
]
if
!
ok
{
serviceState
=
Statistic
{
ServiceName
:
serviceName
,
ServiceName
:
serviceName
,
IsRestricted
:
isRestricted
,
IsRoleBased
:
isRoleBased
,
}
}
serviceState
.
TotalHits
++
if
serviceError
!=
nil
{
serviceState
.
ErrorCount
++
serviceState
.
LastError
=
serviceError
.
Error
()
ct
:=
time
.
Now
()
serviceState
.
ErrorTime
=
&
ct
}
else
{
serviceState
.
TotalTime
+=
servingTime
if
servingTime
>
serviceState
.
MaxTime
{
serviceState
.
MaxTime
=
servingTime
}
else
if
servingTime
<
serviceState
.
MinTime
{
}
if
servingTime
<
serviceState
.
MinTime
||
serviceState
.
MinTime
==
0
{
serviceState
.
MinTime
=
servingTime
}
}
stateCache
[
serviceName
]
=
serviceState
stateMutex
.
Unlock
()
updateGlobalHit
()
}
// UpdateGlobalServiceCacheState - update only cache hits and miss count for all services
...
...
@@ -96,6 +141,7 @@ func UpdateGlobalServiceCacheState(cacheHit bool) {
// StateHandler handler function for sta
func
StateHandler
(
c
*
gin
.
Context
)
{
c
.
Header
(
"Access-Control-Allow-Origin"
,
"*"
)
clientResponseData
:=
&
clientResponse
{}
clientResponseData
.
StartTime
=
serverStartTime
cacheStatistic
.
cacheHitsMutex
.
Lock
()
...
...
@@ -103,6 +149,32 @@ func StateHandler(c *gin.Context) {
clientResponseData
.
CacheHits
=
cacheStatistic
.
cacheHits
clientResponseData
.
CacheMiss
=
cacheStatistic
.
cacheMiss
cacheStatistic
.
cacheHitsMutex
.
Unlock
()
groupMutex
.
Lock
()
current
:=
time
.
Now
()
if
current
.
Unix
()
>
nextGroup
{
tmp
:=
time
.
Unix
(
currentGroup
,
0
)
for
{
tmp
=
tmp
.
Add
(
nextTime
)
if
tmp
.
Unix
()
>=
current
.
Unix
()
{
break
}
groupName
=
append
(
groupName
,
tmp
.
Unix
())
groupHits
=
append
(
groupHits
,
0
)
currentGroup
=
tmp
.
Unix
()
nextGroup
=
tmp
.
Add
(
nextTime
)
.
Unix
()
}
}
for
i
,
name
:=
range
groupName
{
gr
:=
groupResponse
{}
// gr.GroupTime = int64(time.Unix(name, 0).Second())
gr
.
GroupTime
=
time
.
Unix
(
name
,
0
)
.
String
()
gr
.
Hits
=
groupHits
[
i
]
clientResponseData
.
GroupReport
=
append
(
clientResponseData
.
GroupReport
,
gr
)
}
if
len
(
clientResponseData
.
GroupReport
)
>
10
{
clientResponseData
.
GroupReport
=
clientResponseData
.
GroupReport
[
len
(
clientResponseData
.
GroupReport
)
-
10
:
]
}
groupMutex
.
Unlock
()
clientResponseData
.
ServicesState
=
stateCache
c
.
JSON
(
http
.
StatusOK
,
clientResponseData
)
}
This diff is collapsed.
Click to expand it.
testingdata/testData/config/config.toml
+
4
−
4
View file @
5ee216b1
...
...
@@ -5,7 +5,7 @@ version = "1.2.2"
[mongohosts]
[mongohosts.host1]
server
=
"
localhost
:27017"
username
=
"roshan"
password
=
"roshan"
database
=
"
cdp
"
server
=
"
10.2.10.160
:27017"
#
username = "roshan"
#
password = "roshan"
database
=
"
Timeline
"
This diff is collapsed.
Click to expand it.
testingdata/users.json
+
578
−
64
View file @
5ee216b1
[{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
}]
\ No newline at end of file
[
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
},
{
"name"
:
"CDPUser"
,
"loginId"
:
"cdpuser"
,
"emailId"
:
""
,
"password"
:
"cdpuser123"
,
"oldPassword"
:
""
,
"mobileNo"
:
""
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
""
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"0xvdsBXmB51OX68TNGSC4TmYzHt"
},
{
"name"
:
"Roshan Patil"
,
"loginId"
:
"roshanp"
,
"emailId"
:
"roshanp@mkcl.org"
,
"password"
:
"roshanp"
,
"oldPassword"
:
""
,
"mobileNo"
:
"84211553539"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"4463acaefbcf3e6511883f9d4f0b6076.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4463acaefbcf3e6511883f9d4f0b6076"
},
{
"name"
:
"roshanp"
,
"loginId"
:
"roshanp1"
,
"emailId"
:
"roshanp1@mkcl.org"
,
"password"
:
"roshanp1"
,
"oldPassword"
:
""
,
"mobileNo"
:
"8421553539"
,
"isEnabled"
:
false
,
"confirmPassword"
:
""
,
"path"
:
"4a6a605fb3fee94244c06f53613bedd4.jpg"
,
"pre"
:
{
"group"
:
[
"Publisher"
],
"roles"
:
[]
},
"userId"
:
"4a6a605fb3fee94244c06f53613bedd4"
},
{
"name"
:
"SystemIntegrator"
,
"loginId"
:
"SystemIntegrator"
,
"emailId"
:
"SystemIntegrator@mkcl.org"
,
"password"
:
"SystemIntegrator"
,
"oldPassword"
:
""
,
"mobileNo"
:
"7875383220"
,
"isEnabled"
:
true
,
"confirmPassword"
:
""
,
"path"
:
"309037970a38dc127deba6ff4352ad70.jpg"
,
"pre"
:
{
"group"
:
[
"Admin"
],
"roles"
:
[]
},
"userId"
:
"309037970a38dc127deba6ff4352ad70"
}
]
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment
Menu
Explore
Projects
Groups
Topics
Snippets