first overflow service commit
This commit is contained in:
commit
19427d74a7
65
.gitignore
vendored
Normal file
65
.gitignore
vendored
Normal file
|
@ -0,0 +1,65 @@
|
|||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### JetBrains template
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff:
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/dictionaries
|
||||
|
||||
# Sensitive or high-churn files:
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.xml
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
|
||||
# Gradle:
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Mongo Explorer plugin:
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
## File-based project format:
|
||||
*.iws
|
||||
|
||||
## Plugin-specific files:
|
||||
|
||||
# IntelliJ
|
||||
/out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
### Go template
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, build with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
|
||||
.glide/
|
||||
.idea/
|
||||
*.iml
|
||||
|
||||
vendor/
|
||||
glide.lock
|
221
gateway/service_test.go
Normal file
221
gateway/service_test.go
Normal file
|
@ -0,0 +1,221 @@
|
|||
package gateway
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"reflect"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"encoding/json"
|
||||
"github.com/golang/glog"
|
||||
"fmt"
|
||||
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/target"
|
||||
)
|
||||
|
||||
func TestServices(t *testing.T) {
|
||||
InitServices()
|
||||
|
||||
meb, _ := g_services["Member"]
|
||||
|
||||
m := make(map[string]string)
|
||||
m["email"] = "geek@loafle.com"
|
||||
m["pw"] = "qwer5795"
|
||||
|
||||
convertParam(meb, m)
|
||||
//val := []reflect.Value{reflect.ValueOf(meb.(*proxy.MemberService))}
|
||||
|
||||
va := reflect.ValueOf(meb).MethodByName("Regist").Call([]reflect.Value{})
|
||||
|
||||
|
||||
//reflect.ValueOf(meb).MethodByName("Read").Call(reflect.ValueOf(meb))
|
||||
|
||||
assert.Equal(t, 0, len(va))
|
||||
}
|
||||
|
||||
func TestServiceParam(t *testing.T) {
|
||||
|
||||
InitServices()
|
||||
|
||||
meb, _ := g_services["Member"]
|
||||
|
||||
m := make(map[string]string)
|
||||
m["email"] = "geek@loafle.com"
|
||||
m["pw"] = "qwer5795"
|
||||
|
||||
|
||||
paramStr, err := json.Marshal(m)
|
||||
|
||||
if err != nil {
|
||||
glog.Fatal("Json Marshal Failed : ", err.Error())
|
||||
}
|
||||
err = json.Unmarshal(paramStr, meb)
|
||||
if err != nil {
|
||||
glog.Fatal("Json Unmarshal Failed : ", err.Error())
|
||||
}
|
||||
|
||||
//assert.ObjectsAreEqual(proxy.MemberService{}, meb)
|
||||
}
|
||||
//
|
||||
//type Member struct {
|
||||
// Email string `json:"email"`
|
||||
// Password string `json:"password"`
|
||||
//}
|
||||
//
|
||||
//type MemberService struct {
|
||||
// ServiceName string `json:"serviceName"`
|
||||
// MethodName string `json:"methodName"`
|
||||
// Param *Member `json:"param"`
|
||||
//}
|
||||
|
||||
func TestExecServices(t *testing.T) {
|
||||
//res := `{"serviceName":"Member","methodName":"Regist","param":{"email":"geek@loafle.com","password":"qwer5795"}}`
|
||||
res := `{"email":"geekloafle@loafle.com","pwSalt":"dssdft","company":"loafle"}`
|
||||
|
||||
m := make(map[string]string)
|
||||
m["model"] = res
|
||||
|
||||
InitServices()
|
||||
|
||||
meb, _ := g_services["Member"]
|
||||
|
||||
methodName := reflect.ValueOf(meb).MethodByName("Regist")
|
||||
params := make([]reflect.Value, methodName.Type().NumIn())
|
||||
var NewObj reflect.Value
|
||||
|
||||
for i := 0; i < methodName.Type().NumIn(); i++{
|
||||
temp := methodName.Type().In(i)
|
||||
|
||||
switch temp.Kind() {
|
||||
case reflect.Ptr:
|
||||
NewObj = reflect.New(temp.Elem())
|
||||
convertParam(NewObj.Interface(), m)
|
||||
params[i] = NewObj
|
||||
}
|
||||
}
|
||||
|
||||
result := methodName.Call(params)[0].String()
|
||||
fmt.Println(result)
|
||||
}
|
||||
|
||||
//func TestReflectType(t *testing.T) {
|
||||
//ss := &MemberService{}
|
||||
////t1 := reflect.ValueOf(ss.Param).Elem()
|
||||
//
|
||||
//ms1 := reflect.New(reflect.TypeOf(ss.Param)).Elem().Type()
|
||||
//
|
||||
//fmt.Println(ms1)
|
||||
////ss.Param = ms1
|
||||
////ss.Param.Email = "ddd"
|
||||
////fmt.Println(ss.Param.Email)
|
||||
//ms := reflect.New(reflect.ValueOf(ss.Param).Type()).Elem()
|
||||
//fmt.Printf("created a [%T]\n", reflect.ValueOf(ms).Type())
|
||||
|
||||
|
||||
//}
|
||||
|
||||
func TestConvertParamModel(t *testing.T) {
|
||||
res := `{"email":"geek@loafle.com","pwSalt":"dssdft","company":"loafle"}`
|
||||
|
||||
m := make(map[string]string)
|
||||
m["model"] = res
|
||||
|
||||
mem := &member.Member{}
|
||||
convertParam(mem, m)
|
||||
|
||||
fmt.Println(mem.Email)
|
||||
}
|
||||
|
||||
func TestParamTypeCreate(t *testing.T) {
|
||||
|
||||
ms := member.NewMemberService()
|
||||
|
||||
res := `{"email":"geek@loafle.com","pwSalt":"dssdft","company":"loafle"}`
|
||||
|
||||
method := reflect.ValueOf(ms).MethodByName("Regist")
|
||||
|
||||
var NewObj reflect.Value;
|
||||
for i := 0; i < method.Type().NumIn(); i++ {
|
||||
tt := method.Type().In(i)
|
||||
|
||||
t.Log(tt)
|
||||
|
||||
switch tt.Kind() {
|
||||
case reflect.Ptr :
|
||||
NewObj = reflect.New(tt.Elem())
|
||||
}
|
||||
|
||||
|
||||
//obj = NewObj.Elem().Interface()
|
||||
|
||||
//intPtr := reflect.New(tt)
|
||||
//obj := intPtr.Elem().Interface()
|
||||
|
||||
err := json.Unmarshal([]byte(res), NewObj.Interface())
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
t.Log(NewObj)
|
||||
}
|
||||
|
||||
params := make([]reflect.Value, method.Type().NumIn())
|
||||
|
||||
params[0] = NewObj;
|
||||
|
||||
result := method.Call(params)[0].String()
|
||||
|
||||
t.Log(result)
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
func TestListReflect(t *testing.T) {
|
||||
|
||||
res := "[{\"id\":1,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496631864025,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}},{\"id\":2,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496635285090,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}},{\"id\":3,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496642868260,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}},{\"id\":4,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496814093714,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}},{\"id\":5,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496814103052,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}},{\"id\":6,\"ip\":3232235882,\"port\":5432,\"targetType\":\"DATABASE\",\"vendorName\":\"PostgreSQL 9.5.0\",\"kinds\":\"PostgreSQL\",\"version\":\"9.5.0\",\"createDate\":1496814184478,\"member\":{\"id\":1,\"email\":\"ddddd@loafle.com\",\"pwSalt\":\"salktttt\",\"digest\":\"bbbbbbbbb\",\"name\":\"snnnnn\",\"company\":\"loafle\",\"phone\":\"000-000-0000\",\"authorizedDate\":null}}]";
|
||||
|
||||
t.Log(res)
|
||||
|
||||
|
||||
ts := target.NewTargetService()
|
||||
|
||||
|
||||
method := reflect.ValueOf(ts).MethodByName("CreateList")
|
||||
|
||||
|
||||
var NewObj reflect.Value;
|
||||
for i := 0; i < method.Type().NumIn(); i++ {
|
||||
tt := method.Type().In(i)
|
||||
|
||||
t.Log(tt)
|
||||
|
||||
switch tt.Kind() {
|
||||
case reflect.Ptr :
|
||||
NewObj = reflect.New(tt.Elem())
|
||||
case reflect.Slice :
|
||||
NewObj = reflect.MakeSlice(tt, 0, 0)
|
||||
}
|
||||
|
||||
err := json.Unmarshal([]byte(res), NewObj.Interface())
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
t.Log(NewObj)
|
||||
|
||||
}
|
||||
|
||||
params := make([]reflect.Value, method.Type().NumIn())
|
||||
|
||||
params[0] = NewObj;
|
||||
|
||||
result := method.Call(params)[0].String()
|
||||
|
||||
t.Log(result)
|
||||
|
||||
|
||||
//ts.cre
|
||||
|
||||
}
|
||||
|
135
gateway/services.go
Normal file
135
gateway/services.go
Normal file
|
@ -0,0 +1,135 @@
|
|||
package gateway
|
||||
|
||||
import (
|
||||
"golang.org/x/net/context"
|
||||
pb "git.loafle.net/overflow/overflow_api_service/grpc"
|
||||
"github.com/golang/glog"
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"errors"
|
||||
"log"
|
||||
|
||||
"git.loafle.net/overflow/overflow_service/proxy/noauthagent"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/target"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/member"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/crawler"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/crawlerInputItem"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/crawlerinputitemmapping"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/sensor"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/sensorItem"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/sensorItemCategory"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/sensorItemMapping"
|
||||
"git.loafle.net/overflow/overflow_service/proxy/agent"
|
||||
//"google.golang.org/grpc/metadata"
|
||||
|
||||
)
|
||||
|
||||
var g_services map[string]interface{}
|
||||
|
||||
func AddServices(name string, s interface{}) {
|
||||
if g_services == nil {
|
||||
g_services = make(map[string]interface{},0)
|
||||
}
|
||||
|
||||
g_services[name] = s
|
||||
}
|
||||
|
||||
type Services interface {
|
||||
GetModel()(interface{})
|
||||
}
|
||||
|
||||
func InitServices() {
|
||||
g_services = make(map[string]interface{},0)
|
||||
|
||||
// proxy services save
|
||||
//AddServices("Agent", agent.NewAgentService())
|
||||
AddServices("Member", member.NewMemberService())
|
||||
AddServices("NoAuthAgent", noauthagent.NewNoAuthAgentService())
|
||||
AddServices("Agent", agent.NewAgentService())
|
||||
AddServices("Target", target.NewTargetService())
|
||||
AddServices("Crawler", crawler.NewCrawlerService())
|
||||
AddServices("CrawlerInputItem", crawlerInputItem.NewCrawlerInputItemService())
|
||||
AddServices("CrawlerInputItemMapping", crawlerinputitemmapping.NewCrawlerInputItemMappingService())
|
||||
AddServices("Sensor", sensor.NewSensorService())
|
||||
AddServices("SensorItem", sensorItem.NewSensorItemService())
|
||||
AddServices("SensorItemCategory", sensorItemCategory.NewSensorItemCategoryService())
|
||||
AddServices("SensorItemMapping", sensorItemMapping.NewSensorItemMappingService())
|
||||
|
||||
}
|
||||
type ServiceImpl struct {
|
||||
|
||||
}
|
||||
|
||||
func (s *ServiceImpl) ExecServices(c context.Context, in *pb.ServiceInput) (*pb.ServiceOutput, error) {
|
||||
// Check Service Name
|
||||
serviceName, ok := g_services[in.ServiceName]
|
||||
//metadata.FromContext(c)
|
||||
log.Println("Service Name : " + in.ServiceName + " MethodName : " + in.MethodName)
|
||||
|
||||
if !ok {
|
||||
|
||||
return nil, errors.New("Not Exist Service Name")
|
||||
}
|
||||
|
||||
|
||||
|
||||
pbs := &pb.ServiceOutput{}
|
||||
methodName := reflect.ValueOf(serviceName).MethodByName(in.MethodName)
|
||||
|
||||
|
||||
if methodName.IsValid() == false {
|
||||
return pbs, errors.New("Not Exist Method Name")
|
||||
}
|
||||
|
||||
params := make([]reflect.Value, methodName.Type().NumIn())
|
||||
var NewObj reflect.Value
|
||||
|
||||
for i := 0; i < methodName.Type().NumIn(); i++{
|
||||
temp := methodName.Type().In(i)
|
||||
|
||||
switch temp.Kind() {
|
||||
case reflect.Ptr:
|
||||
NewObj = reflect.New(temp.Elem())
|
||||
}
|
||||
convertParam(NewObj.Interface(), in.Param)
|
||||
params[i] = NewObj
|
||||
}
|
||||
|
||||
// Todo Call Service Method
|
||||
results := methodName.Call(params);
|
||||
|
||||
result := results[0].Interface().(string)
|
||||
|
||||
var err error = nil;
|
||||
if len(result) > 1 {
|
||||
obj := results[1].Interface()
|
||||
if obj != nil {
|
||||
log.Println("err : " + err.Error())
|
||||
err = obj.(error)
|
||||
return pbs, err
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pbs.ResultStr = result
|
||||
|
||||
return pbs, nil
|
||||
}
|
||||
|
||||
func convertParam(sn interface{}, param map[string]string) {
|
||||
|
||||
// param convert string
|
||||
//paramStr, err := json.Marshal(param)
|
||||
//if err != nil {
|
||||
// glog.Fatal("Json Marshal Failed : ", err.Error())
|
||||
//}
|
||||
|
||||
paramStr := param["model"]
|
||||
// service converting
|
||||
log.Println("input model : ", paramStr)
|
||||
err := json.Unmarshal([]byte(paramStr), sn)
|
||||
if err != nil {
|
||||
glog.Fatal("Json Unmarshal Failed : ", err.Error())
|
||||
}
|
||||
|
||||
}
|
32
glide.yaml
Normal file
32
glide.yaml
Normal file
|
@ -0,0 +1,32 @@
|
|||
package: git.loafle.net/overflow/overflow_gateway_service
|
||||
import:
|
||||
- package: git.loafle.net/overflow/overflow_api_service
|
||||
version: master
|
||||
repo: https://git.loafle.net/overflow/overflow_api_service.git
|
||||
vcs: git
|
||||
subpackages:
|
||||
- grpc
|
||||
- package: git.loafle.net/overflow/overflow_proxy_service
|
||||
version: master
|
||||
repo: https://git.loafle.net/overflow/overflow_proxy_service.git
|
||||
vcs: git
|
||||
subpackages:
|
||||
- proxy/member
|
||||
- proxy/noauthagent
|
||||
- proxy/agent
|
||||
- package: github.com/golang/glog
|
||||
- package: github.com/grpc-ecosystem/grpc-gateway
|
||||
version: ^1.2.2
|
||||
subpackages:
|
||||
- runtime
|
||||
- package: golang.org/x/net
|
||||
subpackages:
|
||||
- context
|
||||
- package: google.golang.org/grpc
|
||||
- package: git.loafle.net/overflow/overflow_gateway_service
|
||||
subpackages:
|
||||
- gateway
|
||||
testImport:
|
||||
- package: github.com/stretchr/testify
|
||||
subpackages:
|
||||
- assert
|
17
gwrpc_main.go
Normal file
17
gwrpc_main.go
Normal file
|
@ -0,0 +1,17 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"github.com/golang/glog"
|
||||
"git.loafle.net/overflow/overflow_gateway_service/server"
|
||||
)
|
||||
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
defer glog.Flush()
|
||||
|
||||
if err := server.RunGwRpc(); err != nil {
|
||||
glog.Fatal(err)
|
||||
}
|
||||
}
|
85
proxy/agent/agent_service.go
Normal file
85
proxy/agent/agent_service.go
Normal file
|
@ -0,0 +1,85 @@
|
|||
package agent
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
//"fmt"
|
||||
//"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
"time"
|
||||
)
|
||||
|
||||
type AgentService struct {
|
||||
}
|
||||
|
||||
type Agent struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
AuthorizedDate int64 `json:"authorizedDate,Number,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
Member member.Member `json:"member,omitempty"`
|
||||
LastPollingDate int64 `json:"lastPollingDate,omitempty"`
|
||||
Status string `json:"status,omitempty"`
|
||||
}
|
||||
|
||||
func NewAgentService() *AgentService {
|
||||
return &AgentService{}
|
||||
}
|
||||
|
||||
func NewAgent(desc string, member member.Member) *Agent {
|
||||
|
||||
na := &Agent{
|
||||
AuthorizedDate: time.Now().Unix(),
|
||||
Description: desc,
|
||||
Member: member,
|
||||
}
|
||||
return na
|
||||
}
|
||||
|
||||
func (as *AgentService) SaveAgent(agent *Agent) (string, error) {
|
||||
//bytes, err := json.Marshal(agent)
|
||||
//if err != nil {
|
||||
// return "", err
|
||||
//}
|
||||
//fmt.Println(agent.Member.Id)
|
||||
//fmt.Println(string(bytes))
|
||||
//paramMap := make(map[string]string)
|
||||
//paramMap["com.loafle.overflow.agent.model.Agent"] = string(bytes)
|
||||
//
|
||||
//out, err := proxy.InvokeDB("agent", "create", paramMap)
|
||||
|
||||
out, err := utils.InvokeDB("agent", "create", agent)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (as *AgentService) GetAgentList(mem *member.Member) (string, error) {
|
||||
//paramMap := make(map[string]string)
|
||||
//
|
||||
//mem := member.NewMember()
|
||||
//mem.Id = json.Number(memberId)
|
||||
//
|
||||
//bytes, err := json.Marshal(mem)
|
||||
//if err != nil {
|
||||
// return "", err
|
||||
//}
|
||||
//
|
||||
//paramMap["com.loafle.overflow.member.model.Member"] = string(bytes)
|
||||
//
|
||||
//out, err := proxy.InvokeDB("agent", "findAgentListByMemberId", paramMap)
|
||||
|
||||
out, err := utils.InvokeDBByModel("agent", "findAgentListByMemberId", mem, "com.loafle.overflow.member.model.Member")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (as *AgentService) GetModel() interface{} {
|
||||
return &Agent{}
|
||||
}
|
33
proxy/agent/agent_service_test.go
Normal file
33
proxy/agent/agent_service_test.go
Normal file
|
@ -0,0 +1,33 @@
|
|||
package agent
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
)
|
||||
|
||||
func TestSaveAgent(t *testing.T) {
|
||||
m := member.Member{}
|
||||
m.Id = json.Number("1")
|
||||
|
||||
agt := NewAgent("test agent424", m)
|
||||
as := NewAgentService()
|
||||
|
||||
res, err := as.SaveAgent(agt)
|
||||
if err != nil {
|
||||
t.Log(res)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func TestListAgent(t *testing.T) {
|
||||
as := NewAgentService()
|
||||
m := member.Member{}
|
||||
m.Id = "1"
|
||||
if res, err := as.getAgentList(&m); err != nil {
|
||||
t.Fatal(err)
|
||||
}else {
|
||||
t.Log(res)
|
||||
}
|
||||
|
||||
}
|
84
proxy/apikey/apikey_service.go
Normal file
84
proxy/apikey/apikey_service.go
Normal file
|
@ -0,0 +1,84 @@
|
|||
package apikey
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
//"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
//"log"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type ApiKeyService struct {
|
||||
|
||||
}
|
||||
|
||||
type ApiKey struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Apikey string `json:"apiKey,omitempty"`
|
||||
CreateDAte timestamp.Timestamp`json:"createDate,omitempty"`
|
||||
HostName string `json:"hostName,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
func NewApiKeyService() *ApiKeyService {
|
||||
return &ApiKeyService{}
|
||||
}
|
||||
|
||||
|
||||
func(k *ApiKeyService)SaveApikey(key *ApiKey) (string, error) {
|
||||
|
||||
|
||||
//bytes, err := json.Marshal(key)
|
||||
//
|
||||
//if err != nil {
|
||||
// return "", err
|
||||
//}
|
||||
//
|
||||
//m := make(map[string]string)
|
||||
//
|
||||
//m["com.loafle.overflow.keystore.model.Apikey"] = string(bytes)
|
||||
//
|
||||
//out := proxy.InvokeDB("apiKey", "create", m)
|
||||
//
|
||||
//log.Print(out)
|
||||
|
||||
out, err := utils.InvokeDBByModel("apiKey", "create", key, "com.loafle.overflow.keystore.model.Apikey")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
|
||||
}
|
||||
|
||||
func(k *ApiKeyService)CheckApikey(apikey string) (bool, error) {
|
||||
|
||||
ak := ApiKey{
|
||||
Apikey:apikey,
|
||||
}
|
||||
|
||||
//bytes, err := json.Marshal(ak)
|
||||
//
|
||||
//if err != nil {
|
||||
// return false, err
|
||||
//}
|
||||
//
|
||||
//m := make(map[string]string)
|
||||
//
|
||||
//m["com.loafle.overflow.keystore.model.Apikey"] = string(bytes)
|
||||
//
|
||||
//out := proxy.InvokeDB("apiKey", "findByApiKey", m)
|
||||
//
|
||||
//log.Print(out)
|
||||
|
||||
_, err := utils.InvokeDB("apiKey", "findByApiKey", ak)
|
||||
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
return true, nil
|
||||
|
||||
|
||||
}
|
1
proxy/apikey/apikey_service_test.go
Normal file
1
proxy/apikey/apikey_service_test.go
Normal file
|
@ -0,0 +1 @@
|
|||
package apikey
|
58
proxy/crawler/crawler_service.go
Normal file
58
proxy/crawler/crawler_service.go
Normal file
|
@ -0,0 +1,58 @@
|
|||
package crawler
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
//"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type CrawlerService struct {
|
||||
|
||||
}
|
||||
|
||||
func NewCrawlerService() *CrawlerService {
|
||||
return &CrawlerService{}
|
||||
}
|
||||
|
||||
|
||||
type Crawler struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
CrawlerType string `json:"crawlerType,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
func (c *CrawlerService)List() (string, error) {
|
||||
|
||||
|
||||
//out := proxy.InvokeDB("crawler", "findAll", nil)
|
||||
|
||||
out, err := utils.InvokeDB("crawler", "findAll", nil)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
||||
|
||||
|
||||
func (c *CrawlerService)Create(ct * Crawler) (string, error) {
|
||||
|
||||
|
||||
|
||||
out, err := utils.InvokeDB("crawler", "create", ct)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, nil
|
||||
}
|
14
proxy/crawler/crawler_service_test.go
Normal file
14
proxy/crawler/crawler_service_test.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
package crawler
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestList(t *testing.T) {
|
||||
|
||||
cs := NewCrawlerService()
|
||||
|
||||
out := cs.List()
|
||||
|
||||
|
||||
t.Log(out)
|
||||
|
||||
}
|
38
proxy/crawlerInputItem/crawlerinputitem_service.go
Normal file
38
proxy/crawlerInputItem/crawlerinputitem_service.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package crawlerInputItem
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type CrawlerInputItem struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
DataType string `json:"dataType,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
type CrawlerInputItemSerivce struct {
|
||||
|
||||
}
|
||||
|
||||
func NewCrawlerInputItemService() *CrawlerInputItemSerivce {
|
||||
return &CrawlerInputItemSerivce{}
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (c *CrawlerInputItemSerivce)Create(cii * CrawlerInputItem) (string, error) {
|
||||
|
||||
out, err := utils.InvokeDB("crawlerInputItem", "create", cii)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, nil;
|
||||
|
||||
}
|
1
proxy/crawlerInputItem/crawlerinputitem_service_test.go
Normal file
1
proxy/crawlerInputItem/crawlerinputitem_service_test.go
Normal file
|
@ -0,0 +1 @@
|
|||
package crawlerInputItem
|
|
@ -0,0 +1,55 @@
|
|||
package crawlerinputitemmapping
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawler"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawlerInputItem"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type CrawlerInputItemMapping struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Crawler crawler.Crawler `json:"crawler,omitempty"`
|
||||
CrawlerInputItem crawlerInputItem.CrawlerInputItem `json:"crawlerInputItem,omitempty"`
|
||||
|
||||
Priority json.Number `json:"priority,Number,omitempty"`
|
||||
RequiredType bool `json:"requiredType,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
type CrawlerInputItemMappingService struct {
|
||||
|
||||
}
|
||||
|
||||
func NewCrawlerInputItemMappingService() *CrawlerInputItemMappingService {
|
||||
return &CrawlerInputItemMappingService{}
|
||||
}
|
||||
|
||||
func (c *CrawlerInputItemMappingService)Create(ciim *CrawlerInputItemMapping) (string, error) {
|
||||
|
||||
out, err := utils.InvokeDB("crawlerInputItemMapping", "create", ciim)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, nil;
|
||||
|
||||
}
|
||||
|
||||
func (c *CrawlerInputItemMappingService)List(cr *crawler.Crawler) (string, error) {
|
||||
|
||||
|
||||
out, err := utils.InvokeDBByModel("crawlerInputItemMapping", "findByCrawlerId", cr, "com.loafle.overflow.crawler.model.Crawler")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, nil;
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
package crawlerinputitemmapping
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawler"
|
||||
)
|
||||
|
||||
func TestListCrawler(t *testing.T) {
|
||||
|
||||
|
||||
|
||||
niin := NewCrawlerInputItemMappingService()
|
||||
|
||||
|
||||
cc := &crawler.Crawler{}
|
||||
|
||||
cc.Id = "1";
|
||||
|
||||
out := niin.List(cc)
|
||||
|
||||
|
||||
t.Log(out)
|
||||
|
||||
}
|
207
proxy/email/email_service.go
Normal file
207
proxy/email/email_service.go
Normal file
|
@ -0,0 +1,207 @@
|
|||
package email
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"github.com/google/uuid"
|
||||
"log"
|
||||
"net"
|
||||
"net/mail"
|
||||
"net/smtp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
FROM = "geek@loafle.com"
|
||||
SERVER_NAME = "smtp.worksmobile.com:465"
|
||||
SUBJECT = "This is the Test Email"
|
||||
BODY_MSG = "This is an Example Email\n with two lines \n http://localhost:8080/v1/overflow/services"
|
||||
SERVER_PASS = "@loafle@5795"
|
||||
)
|
||||
|
||||
type Email struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Member member.Member `json:"member"`
|
||||
From string `json:"_"`
|
||||
Subj string `json:"_"`
|
||||
AuthToken string `json:"authToken"`
|
||||
IsInvalid bool `json:"isInvalid"`
|
||||
IsConfirm bool `json:"isConfirm"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
UpdateDate timestamp.Timestamp `json:"updateDate,omitempty"`
|
||||
ConfirmDate timestamp.Timestamp `json:"confirmDate,omitempty"`
|
||||
SmtpServer string `json:"_"`
|
||||
BodyMsg string `json:"_"`
|
||||
}
|
||||
|
||||
func NewEmail(member member.Member, subject string) *Email {
|
||||
|
||||
if subject == "" {
|
||||
subject = SUBJECT
|
||||
}
|
||||
|
||||
return &Email{
|
||||
Member: member,
|
||||
From: FROM,
|
||||
Subj: subject,
|
||||
SmtpServer: SERVER_NAME,
|
||||
}
|
||||
}
|
||||
|
||||
type EmailService struct {
|
||||
}
|
||||
|
||||
func NewEmailService() *EmailService {
|
||||
return &EmailService{}
|
||||
}
|
||||
|
||||
func (es *EmailService) checkError(err error) {
|
||||
if err != nil {
|
||||
log.Panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
func (es *EmailService) getSendMailMessage(e *Email) string {
|
||||
to := mail.Address{"Park Byung Eun", e.Member.Email}
|
||||
from := mail.Address{"Overflow", e.From}
|
||||
//body := "This is an Example Email\n with two lines \n http://localhost:8080/v1/overflow/services"
|
||||
|
||||
// Setup headers
|
||||
headers := make(map[string]string)
|
||||
headers["From"] = from.String()
|
||||
headers["To"] = to.String()
|
||||
headers["Subject"] = e.Subj
|
||||
|
||||
message := ""
|
||||
|
||||
for k, v := range headers {
|
||||
message += fmt.Sprintf("%s: %s\r\n", k, v)
|
||||
}
|
||||
message += "\r\n" + BODY_MSG
|
||||
|
||||
return message
|
||||
}
|
||||
|
||||
func (es *EmailService) generationAuthToken(e *Email) string {
|
||||
var tempToken string
|
||||
|
||||
uuid, _ := uuid.NewRandom()
|
||||
tempToken += strings.ToUpper(uuid.String())
|
||||
|
||||
return tempToken
|
||||
}
|
||||
|
||||
func (es *EmailService) SendEmailForAuth(e *Email) error {
|
||||
to := mail.Address{"Park Byung Eun", e.Member.Email}
|
||||
from := mail.Address{"Overflow", e.From}
|
||||
|
||||
message := es.getSendMailMessage(e)
|
||||
|
||||
host, _, _ := net.SplitHostPort(SERVER_NAME)
|
||||
auth := smtp.PlainAuth("", FROM, SERVER_PASS, host)
|
||||
|
||||
// TLS config
|
||||
tlsconfig := &tls.Config{
|
||||
InsecureSkipVerify: true,
|
||||
ServerName: host,
|
||||
}
|
||||
|
||||
//Todo auth token generation
|
||||
e.AuthToken = es.generationAuthToken(e)
|
||||
e.IsInvalid = false
|
||||
e.IsConfirm = false
|
||||
|
||||
conn, err := tls.Dial("tcp", SERVER_NAME, tlsconfig)
|
||||
es.checkError(err)
|
||||
|
||||
c, err := smtp.NewClient(conn, host)
|
||||
es.checkError(err)
|
||||
|
||||
// Auth
|
||||
err = c.Auth(auth)
|
||||
es.checkError(err)
|
||||
|
||||
// To && From
|
||||
err = c.Mail(from.Address)
|
||||
es.checkError(err)
|
||||
|
||||
err = c.Rcpt(to.Address)
|
||||
es.checkError(err)
|
||||
|
||||
// Data
|
||||
w, err := c.Data()
|
||||
es.checkError(err)
|
||||
|
||||
_, err = w.Write([]byte(message))
|
||||
es.checkError(err)
|
||||
|
||||
err = w.Close()
|
||||
es.checkError(err)
|
||||
|
||||
c.Quit()
|
||||
|
||||
// Todo Save Email For DB
|
||||
es.saveEmail(e)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (es *EmailService) getEmailMap(e *Email) map[string]string {
|
||||
|
||||
emMap := make(map[string]string)
|
||||
|
||||
str, err := json.Marshal(e)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal("Json Marshal Error: ", err)
|
||||
}
|
||||
|
||||
emMap["com.loafle.overflow.email.model.EmailAuth"] = string(str)
|
||||
|
||||
return emMap
|
||||
}
|
||||
|
||||
func (es *EmailService) saveEmail(e *Email) {
|
||||
|
||||
memMap := es.getEmailMap(e)
|
||||
proxy.InvokeDB("emailAuth", "create", memMap)
|
||||
|
||||
}
|
||||
|
||||
func (es *EmailService) CheckAuthURL(e *Email) bool {
|
||||
|
||||
//Query from the database with an authentication token.
|
||||
|
||||
emMap := es.getEmailMap(e)
|
||||
|
||||
re := proxy.InvokeDB("emailAuth", "findByAuthToken", emMap)
|
||||
|
||||
tempEmail := &Email{}
|
||||
json.Unmarshal([]byte(re), tempEmail)
|
||||
|
||||
r := strings.Compare(e.AuthToken, tempEmail.AuthToken)
|
||||
|
||||
//Todo Check for valid
|
||||
|
||||
log.Println(tempEmail)
|
||||
if r == 0 {
|
||||
// Todo isConfirm change true and db update
|
||||
tempEmail.IsConfirm = true
|
||||
tempEmail.UpdateDate = timestamp.Now()
|
||||
tempEmail.ConfirmDate = timestamp.Now()
|
||||
|
||||
es.modifyEmailAuth(tempEmail)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (es *EmailService) modifyEmailAuth(e *Email) {
|
||||
emMap := es.getEmailMap(e)
|
||||
|
||||
proxy.InvokeDB("emailAuth", "update", emMap)
|
||||
}
|
44
proxy/email/email_service_test.go
Normal file
44
proxy/email/email_service_test.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package email
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"fmt"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
func getEmailObj() (*Email,*EmailService) {
|
||||
es := NewEmailService()
|
||||
m := member.Member{
|
||||
Email:"geek@loafle.com",
|
||||
Name:"geek",
|
||||
Company:"loafle",
|
||||
Id:json.Number("4"),
|
||||
}
|
||||
e := NewEmail(m, "Hello Oveflow")
|
||||
|
||||
return e,es
|
||||
}
|
||||
func TestSendEmailForAuth(t *testing.T) {
|
||||
e, es := getEmailObj()
|
||||
|
||||
es.SendEmailForAuth(e)
|
||||
}
|
||||
|
||||
func TestEmailService_CheckAuthURL(t *testing.T) {
|
||||
e, es := getEmailObj()
|
||||
|
||||
//e.Id = json.Number("2")
|
||||
e.AuthToken = "3C03F8AB-1D4D-4C8A-8C36-EE2D644988B5"
|
||||
|
||||
rr := es.CheckAuthURL(e)
|
||||
|
||||
fmt.Println(rr)
|
||||
}
|
||||
func TestAuthTokenGeneration(t *testing.T) {
|
||||
|
||||
e, es := getEmailObj()
|
||||
tt := es.generationAuthToken(e)
|
||||
|
||||
fmt.Println(tt)
|
||||
}
|
24
proxy/keystore/keystore_service.go
Normal file
24
proxy/keystore/keystore_service.go
Normal file
|
@ -0,0 +1,24 @@
|
|||
package keystore
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type KeyStoreService struct {
|
||||
|
||||
}
|
||||
|
||||
|
||||
func NewKeyStoreSerivce() *KeyStoreService {
|
||||
return &KeyStoreService{}
|
||||
}
|
||||
|
||||
func(k *KeyStoreService)CreateKey() (string,error) {
|
||||
uu, err := uuid.NewUUID();
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return uu.String(), nil
|
||||
}
|
1
proxy/keystore/keystore_service_test.go
Normal file
1
proxy/keystore/keystore_service_test.go
Normal file
|
@ -0,0 +1 @@
|
|||
package keystore
|
178
proxy/member/member_service.go
Normal file
178
proxy/member/member_service.go
Normal file
|
@ -0,0 +1,178 @@
|
|||
package member
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
"log"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/apikey"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/keystore"
|
||||
"git.loafle.net/overflow/encryption_go"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type Member struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Email string `json:"email"`
|
||||
PwSalt string `json:"pwSalt"`
|
||||
Digest string `json:"digest"`
|
||||
Name string `json:"name"`
|
||||
Company string `json:"company"`
|
||||
Phone string `json:"phone"`
|
||||
AuthorizedDate json.Number `json:"authorizedDate,Number"`
|
||||
}
|
||||
|
||||
type MemberService struct {
|
||||
|
||||
}
|
||||
|
||||
var TARGET_DAO = "member"
|
||||
|
||||
func NewMember() *Member {
|
||||
return &Member{}
|
||||
}
|
||||
func NewMemberService() *MemberService {
|
||||
return &MemberService{}
|
||||
}
|
||||
|
||||
func (m *MemberService) getMemberMap(mem *Member) map[string]string {
|
||||
memMap := make(map[string]string)
|
||||
|
||||
str, err := json.Marshal(mem)
|
||||
|
||||
if err != nil {
|
||||
log.Fatal("Json Marshal Error: ", err)
|
||||
}
|
||||
|
||||
memMap["com.loafle.overflow.member.model.Member"] = string(str)
|
||||
|
||||
return memMap
|
||||
}
|
||||
|
||||
func (m *MemberService) Login(mem *Member) (string,error) {
|
||||
|
||||
result,err := m.ReadByEmail(mem)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if result == "" {
|
||||
return "", errors.New("login reject")
|
||||
}
|
||||
temp := Member{}
|
||||
err = json.Unmarshal([]byte(result), &temp)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if temp.AuthorizedDate == "" {
|
||||
return "", errors.New("Not authenticated.")
|
||||
}
|
||||
|
||||
b := encryption.Check(mem.PwSalt, temp.PwSalt, temp.Digest)
|
||||
if !b {
|
||||
return "", errors.New("login reject")
|
||||
}
|
||||
|
||||
return "login success", nil
|
||||
}
|
||||
|
||||
func (m *MemberService) Regist(mem *Member) (string, error ){
|
||||
log.Println("Call Regist", mem.Email, mem.PwSalt)
|
||||
|
||||
pwSalt, digest, err := encryption.Encrypt(mem.PwSalt)
|
||||
if err != nil {
|
||||
//log.Fatal("encryption Encrypt Error: ", err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
mem.PwSalt = pwSalt
|
||||
mem.Digest = digest
|
||||
memMap := m.getMemberMap(mem)
|
||||
|
||||
re, err := proxy.InvokeDB(TARGET_DAO, "create", memMap)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return re, nil
|
||||
}
|
||||
|
||||
func (m *MemberService) ReadByEmail(mem *Member) (string, error){
|
||||
log.Println("Call ReadByEmail", mem.Email)
|
||||
memMap := m.getMemberMap(mem)
|
||||
re, err := proxy.InvokeDB(TARGET_DAO, "findByEmail", memMap)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return re, nil
|
||||
}
|
||||
|
||||
func (m *MemberService) Read(mem *Member) (string, error) {
|
||||
log.Println("Call Read", mem.Email)
|
||||
// Todo Call DB Gateway
|
||||
mem.Digest = "qwer5795"
|
||||
//memMap := m.getMemberMap()
|
||||
mm := make(map[string]string)
|
||||
mm["id"] = string(mem.Id)
|
||||
log.Println("Read Member", m)
|
||||
re, err := proxy.InvokeDB(TARGET_DAO, "find", mm)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return re, err
|
||||
}
|
||||
|
||||
func (m *MemberService) Modify(mem *Member) (string, error) {
|
||||
log.Println("Call Modify", mem.Email, "::", mem.PwSalt)
|
||||
// Todo Call DB Gateway
|
||||
mem.Digest = "read"
|
||||
memMap := m.getMemberMap(mem)
|
||||
|
||||
re, err := proxy.InvokeDB(TARGET_DAO, "update", memMap)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return re, nil
|
||||
}
|
||||
|
||||
func (m *MemberService) Remove(mem *Member) (string, error) {
|
||||
log.Println("Call Remove", mem.Email)
|
||||
// Todo Call DB Gateway
|
||||
//m.Digest = "read"
|
||||
memMap := m.getMemberMap(mem)
|
||||
|
||||
re, err := proxy.InvokeDB(TARGET_DAO, "delete", memMap)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return re, nil
|
||||
}
|
||||
|
||||
|
||||
func (m *MemberService) EmailConfirm() (string, error) {
|
||||
|
||||
ks := keystore.NewKeyStoreSerivce()
|
||||
|
||||
key, err := ks.CreateKey()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
log.Println(key)
|
||||
|
||||
ak := apikey.NewApiKeyService()
|
||||
_, err = ak.SaveApikey(nil)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
//log.Println(out)
|
||||
|
||||
|
||||
return "", nil
|
||||
}
|
108
proxy/member/member_service_test.go
Normal file
108
proxy/member/member_service_test.go
Normal file
|
@ -0,0 +1,108 @@
|
|||
package member
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"encoding/json"
|
||||
"github.com/golang/glog"
|
||||
"fmt"
|
||||
"log"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
|
||||
)
|
||||
|
||||
func TestMemberService_Login(t *testing.T) {
|
||||
|
||||
}
|
||||
|
||||
func TestMemberService_Regist(t *testing.T) {
|
||||
//m := &MemberService{
|
||||
// Param: &Member{
|
||||
// Email:"geek2@loafle.com",
|
||||
// PwSalt:"qwer5795",
|
||||
// Company:"Loafle",
|
||||
// Name:"Geek",
|
||||
// Phone:"010-4055-6699",
|
||||
// },
|
||||
//}
|
||||
|
||||
ms := NewMemberService()
|
||||
|
||||
m := &Member{
|
||||
Email:"geek2@loafle.com",
|
||||
PwSalt:"qwer5795",
|
||||
Company:"Loafle",
|
||||
Name:"Geek",
|
||||
Phone:"010-4055-6699",
|
||||
}
|
||||
retMem, _ := ms.Regist(m)
|
||||
t.Log(retMem)
|
||||
}
|
||||
|
||||
func TestMemberLogin(t *testing.T) {
|
||||
//m := &MemberService{
|
||||
// Param:&Member{
|
||||
// Email:"geek@loafle.com",
|
||||
// PwSalt:"qwer5795",
|
||||
// },
|
||||
//}
|
||||
ms := NewMemberService()
|
||||
m := &Member{
|
||||
Email:"geek@loafle.com",
|
||||
PwSalt:"qwer5795",
|
||||
}
|
||||
|
||||
b, _ := ms.Login(m)
|
||||
t.Log("LOGIN RESULT : ", b)
|
||||
}
|
||||
|
||||
func TestMemberService_Read(t *testing.T) {
|
||||
mm := make(map[string] string)
|
||||
mm["id"] = "12"
|
||||
rr, _ := proxy.InvokeDB(TARGET_DAO, "find", mm)
|
||||
|
||||
log.Println(rr)
|
||||
}
|
||||
|
||||
func TestMemberService_ReadByEmail(t *testing.T) {
|
||||
ms := NewMemberService()
|
||||
m := &Member{
|
||||
Email:"geek@loafle.com",
|
||||
}
|
||||
mm := ms.getMemberMap(m)
|
||||
rr, _ := proxy.InvokeDB(TARGET_DAO, "findByEmail", mm)
|
||||
log.Println(rr)
|
||||
}
|
||||
|
||||
func TestMemberUpdate(t *testing.T) {
|
||||
|
||||
ms := NewMemberService()
|
||||
m := &Member{
|
||||
Id: "11",
|
||||
Email:"keeg@loafle.com",
|
||||
}
|
||||
mm := ms.getMemberMap(m)
|
||||
rr, _ := proxy.InvokeDB(TARGET_DAO, "update", mm)
|
||||
log.Println(rr)
|
||||
}
|
||||
|
||||
func TestComvertJson(t *testing.T) {
|
||||
|
||||
m := make(map[string]string)
|
||||
m["email"] = "geek@loafle.com"
|
||||
m["pwSalt"] = "qwer5795"
|
||||
ss := NewMemberService()
|
||||
|
||||
paramStr, err := json.Marshal(m)
|
||||
if err != nil {
|
||||
glog.Fatal("Json Marshal Failed : ", err.Error())
|
||||
}
|
||||
fmt.Println(paramStr)
|
||||
fmt.Println(ss)
|
||||
// service converting
|
||||
//mem, _ := ss.GetModel()
|
||||
//err = json.Unmarshal(paramStr, mem)
|
||||
//if err != nil {
|
||||
// glog.Fatal("Json Unmarshal Failed : ", err.Error())
|
||||
//}
|
||||
//fmt.Println(mem.(*Member).Email)
|
||||
}
|
160
proxy/noauthagent/noauth_agent_service.go
Normal file
160
proxy/noauthagent/noauth_agent_service.go
Normal file
|
@ -0,0 +1,160 @@
|
|||
package noauthagent
|
||||
|
||||
import (
|
||||
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/agent"
|
||||
"errors"
|
||||
)
|
||||
|
||||
type NoAuthAgentService struct {
|
||||
}
|
||||
|
||||
func NewNoAuthAgentService() *NoAuthAgentService {
|
||||
return &NoAuthAgentService{}
|
||||
}
|
||||
|
||||
|
||||
type NoAuthAgent struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
TempKey string `json:"tempKey,omitempty"`
|
||||
Date timestamp.Timestamp`json:"date,omitempty"`
|
||||
ApiKey string `json:"apiKey,omitempty"`
|
||||
AuthStatus string `json:"authStatus,omitempty"`
|
||||
LocalIP int64 `json:"localIP,omitempty"`
|
||||
HostName string `json:"hostName,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
func NewNoAuthAgent(apikey string, localIp int64, hostName string) *NoAuthAgent {
|
||||
|
||||
na := &NoAuthAgent{
|
||||
Date:timestamp.Now(),
|
||||
ApiKey:apikey,
|
||||
LocalIP:localIp,
|
||||
HostName:hostName,
|
||||
}
|
||||
return na
|
||||
}
|
||||
|
||||
|
||||
func(as *NoAuthAgentService)SaveNoAuthAgent(na *NoAuthAgent) (string, error) {
|
||||
|
||||
|
||||
bytes, err := json.Marshal(na)
|
||||
if err != nil {
|
||||
return "",err
|
||||
}
|
||||
|
||||
memMap := make(map[string]string)
|
||||
memMap["com.loafle.overflow.noauthagent.model.NoAuthAgent"] = string(bytes);
|
||||
|
||||
out, err := proxy.InvokeDB("noauthAgent", "create", memMap);
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil;
|
||||
}
|
||||
|
||||
func(as *NoAuthAgentService)CheckAuth(tempKey string) (string,error) {
|
||||
|
||||
memMap := make(map[string]string)
|
||||
|
||||
na := NewNoAuthAgent("", 0, "")
|
||||
na.TempKey = tempKey
|
||||
|
||||
bytes, err := json.Marshal(na)
|
||||
if err != nil {
|
||||
return "", err;
|
||||
}
|
||||
|
||||
memMap["com.loafle.overflow.noauthagent.model.NoAuthAgent"] = string(bytes);
|
||||
|
||||
out, err := proxy.InvokeDB("noauthAgent", "findByTempKey", memMap);
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
nn := NoAuthAgent{}
|
||||
err = json.Unmarshal([]byte(out), &nn)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out,nil;
|
||||
}
|
||||
|
||||
|
||||
func(as *NoAuthAgentService)GetNoAuthList(excludeStatus string) (string,error) {
|
||||
|
||||
memMap := make(map[string]string)
|
||||
|
||||
na := NewNoAuthAgent("", 0, "")
|
||||
na.AuthStatus = excludeStatus
|
||||
|
||||
bytes, err := json.Marshal(na)
|
||||
if err != nil {
|
||||
return "", err;
|
||||
}
|
||||
|
||||
memMap["com.loafle.overflow.noauthagent.model.NoAuthAgent"] = string(bytes);
|
||||
|
||||
out, err := proxy.InvokeDB("noauthAgent", "findAllByNoAuth", memMap);
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out,nil;
|
||||
}
|
||||
|
||||
|
||||
|
||||
func (as *NoAuthAgentService)RequestAuth(noauthAgt NoAuthAgent, memberId, desc string) (string, error) {
|
||||
paramMap := make(map[string]string)
|
||||
noauthAgt.AuthStatus = "ACCEPT"
|
||||
|
||||
bytes, err := json.Marshal(noauthAgt)
|
||||
if err != nil {
|
||||
return "", err;
|
||||
}
|
||||
paramMap["com.loafle.overflow.noauthagent.model.NoAuthAgent"] = string(bytes)
|
||||
out, err := proxy.InvokeDB("noauthAgent", "update", paramMap)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
if len(out) == 0 {
|
||||
return "", errors.New("Cannot update Agent. ")
|
||||
}
|
||||
m := member.Member{}
|
||||
m.Id = json.Number(memberId)
|
||||
newAgent := agent.NewAgent(desc, m)
|
||||
newone, err := agent.NewAgentService().SaveAgent(newAgent)
|
||||
if err!= nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return newone, nil
|
||||
}
|
||||
|
||||
func (as *NoAuthAgentService)ReadNoAuthAgent(id string) (string, error){
|
||||
mm := make(map[string]string)
|
||||
mm["id"] = id
|
||||
out, err := proxy.InvokeDB("noauthAgent", "find", mm)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
}
|
105
proxy/noauthagent/noauth_agent_service_test.go
Normal file
105
proxy/noauthagent/noauth_agent_service_test.go
Normal file
|
@ -0,0 +1,105 @@
|
|||
package noauthagent
|
||||
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
"testing"
|
||||
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
|
||||
func TestCreateUUid(t *testing.T) {
|
||||
|
||||
uu, err := uuid.NewUUID()
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(uu)
|
||||
|
||||
}
|
||||
|
||||
func TestCreateNoAuthAgent(t *testing.T) {
|
||||
|
||||
na := NewNoAuthAgent("233421390283", 111, "Snoop")
|
||||
|
||||
na.TempKey = "1111111"
|
||||
na.AuthStatus = "WAIT"
|
||||
|
||||
nas := NewNoAuthAgentService()
|
||||
|
||||
out, err := nas.SaveNoAuthAgent(na)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(out)
|
||||
|
||||
}
|
||||
|
||||
func TestCheckAuthNoAuthAgent(t *testing.T) {
|
||||
|
||||
na := NewNoAuthAgent("2334278390283", 111, "Snoop")
|
||||
|
||||
na.TempKey = "alsdkjf;alkdjsf;la"
|
||||
na.AuthStatus = "WAIT"
|
||||
|
||||
nas := NewNoAuthAgentService()
|
||||
|
||||
out, err := nas.CheckAuth(na.TempKey)
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(out)
|
||||
//
|
||||
}
|
||||
|
||||
|
||||
func TestNoAuthList(t *testing.T) {
|
||||
|
||||
|
||||
nas := NewNoAuthAgentService()
|
||||
|
||||
out, err := nas.GetNoAuthList("ACCEPT")
|
||||
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(out)
|
||||
|
||||
}
|
||||
|
||||
func TestRequestAuth(t *testing.T) {
|
||||
nas := NewNoAuthAgentService()
|
||||
res, err := nas.ReadNoAuthAgent("1")
|
||||
|
||||
na := NoAuthAgent{}
|
||||
json.Unmarshal([]byte(res), na)
|
||||
|
||||
newone, err := nas.RequestAuth(na, "1", "test")
|
||||
if err!= nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(newone)
|
||||
}
|
||||
|
||||
|
||||
func TestCheckAuth(t *testing.T) {
|
||||
|
||||
|
||||
ns := NewNoAuthAgentService()
|
||||
|
||||
str, err := ns.CheckAuth("3398473-90847903874")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log(str)
|
||||
|
||||
}
|
45
proxy/sensor/sensor.go
Normal file
45
proxy/sensor/sensor.go
Normal file
|
@ -0,0 +1,45 @@
|
|||
package sensor
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/target"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawler"
|
||||
)
|
||||
|
||||
type Sensor struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Target target.Target `json:"target,omitempty"`
|
||||
Notification string `json:"notification,omitempty"`
|
||||
Crawler crawler.Crawler `json:"crawler,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
type SensorService struct {
|
||||
}
|
||||
|
||||
func NewSensorService() *SensorService {
|
||||
return &SensorService{}
|
||||
}
|
||||
|
||||
func (ss *SensorService) Create(s *Sensor) (string, error) {
|
||||
out, err := utils.InvokeDB("sensor", "create", s)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (ss *SensorService) List(t *target.Target) (string, error) {
|
||||
|
||||
out, err := utils.InvokeDBByModel("sensor", "findAllByTargetId", t, "com.loafle.overflow.target.model.Target")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
|
||||
}
|
18
proxy/sensor/sensor_test.go
Normal file
18
proxy/sensor/sensor_test.go
Normal file
|
@ -0,0 +1,18 @@
|
|||
package sensor
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/target"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSensorService_List(t *testing.T) {
|
||||
|
||||
ts := &target.Target{}
|
||||
ts.Id = json.Number("1")
|
||||
|
||||
ss := NewSensorService()
|
||||
res, _ := ss.List(ts)
|
||||
|
||||
t.Log(res)
|
||||
}
|
47
proxy/sensorItem/sensorItem.go
Normal file
47
proxy/sensorItem/sensorItem.go
Normal file
|
@ -0,0 +1,47 @@
|
|||
package sensorItem
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawler"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/sensorItemCategory"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type SensorItem struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Crawler crawler.Crawler `json:"crawler,omitempty"`
|
||||
SensorItemCategory sensorItemCategory.SensorItemCategory `json:"sensorItemCategory,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
DataType string `json:"dataType,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
type SensorItemService struct {
|
||||
}
|
||||
|
||||
func NewSensorItemService() *SensorItemService {
|
||||
return &SensorItemService{}
|
||||
}
|
||||
|
||||
func (sis *SensorItemService) Create(si *SensorItem) (string, error) {
|
||||
out, err := utils.InvokeDBByModel("sensorItem", "create", si, "com.loafle.overflow.sensor.model.SensorItem")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (ss *SensorItemService) List(cr *crawler.Crawler) (string, error) {
|
||||
|
||||
out, err := utils.InvokeDBByModel("sensorItem", "findAllByCrawlerId", cr, "com.loafle.overflow.crawler.model.Crawler")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
|
||||
}
|
18
proxy/sensorItem/sensorItem_test.go
Normal file
18
proxy/sensorItem/sensorItem_test.go
Normal file
|
@ -0,0 +1,18 @@
|
|||
package sensorItem
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/crawler"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestSensorItemService_List(t *testing.T) {
|
||||
|
||||
cr := &crawler.Crawler{}
|
||||
cr.Id = json.Number("1")
|
||||
sis := NewSensorItemService()
|
||||
|
||||
res, _ := sis.List(cr)
|
||||
|
||||
t.Log(res)
|
||||
}
|
30
proxy/sensorItemCategory/sensorItemCategory.go
Normal file
30
proxy/sensorItemCategory/sensorItemCategory.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package sensorItemCategory
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type SensorItemCategory struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Name string `json:"name,omitempty"`
|
||||
Description string `json:"description,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
type SensorItemCategoryService struct {
|
||||
}
|
||||
|
||||
func NewSensorItemCategoryService() *SensorItemCategoryService {
|
||||
return &SensorItemCategoryService{}
|
||||
}
|
||||
|
||||
func (sics *SensorItemCategoryService) Create(sic *SensorItemCategory) (string, error) {
|
||||
out, err := utils.InvokeDBByModel("sensorItemCategory", "create", sic, "com.loafle.overflow.sensor.model.SensorItemCategory")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return out, nil
|
||||
}
|
1
proxy/sensorItemCategory/sensorItemCategory_test.go
Normal file
1
proxy/sensorItemCategory/sensorItemCategory_test.go
Normal file
|
@ -0,0 +1 @@
|
|||
package sensorItemCategory
|
65
proxy/sensorItemMapping/sensorItemMapping.go
Normal file
65
proxy/sensorItemMapping/sensorItemMapping.go
Normal file
|
@ -0,0 +1,65 @@
|
|||
package sensorItemMapping
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/sensor"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/sensorItem"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
)
|
||||
|
||||
type SensorItemMapping struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Sensor sensor.Sensor `json:"sensor,omitempty"`
|
||||
SensorItem sensorItem.SensorItem `json:"sensorItem,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
}
|
||||
|
||||
type SensorItemMappingService struct {
|
||||
}
|
||||
|
||||
func NewSensorItemMappingService() *SensorItemMappingService {
|
||||
return &SensorItemMappingService{}
|
||||
}
|
||||
|
||||
func (sims *SensorItemMappingService) Create(sim *SensorItemMapping) (string, error) {
|
||||
out, err := utils.InvokeDBByModel("sensorItemMapping", "create", sim, "com.loafle.overflow.sensor.model.SensorItemMapping")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func (sims *SensorItemMappingService) CreateAll(siml *[]*SensorItemMapping) (string, error) {
|
||||
|
||||
outlist := make([]string, 0)
|
||||
for _, sim := range *siml {
|
||||
out,err := sims.Create(sim)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
outlist = append(outlist, out)
|
||||
}
|
||||
|
||||
bytes,err := json.Marshal(outlist)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(bytes), nil
|
||||
|
||||
}
|
||||
|
||||
func (ss *SensorItemMappingService) List(s *sensor.Sensor) (string, error) {
|
||||
|
||||
out, err := utils.InvokeDBByModel("sensorItemMapping", "findAllBySensorId", s, "com.loafle.overflow.sensor.model.Sensor")
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return out, nil
|
||||
|
||||
}
|
60
proxy/sensorItemMapping/sensorItemMapping_test.go
Normal file
60
proxy/sensorItemMapping/sensorItemMapping_test.go
Normal file
|
@ -0,0 +1,60 @@
|
|||
package sensorItemMapping
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/sensor"
|
||||
"testing"
|
||||
"fmt"
|
||||
"sync"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func TestSensorItemMappingService_List(t *testing.T) {
|
||||
s := &sensor.Sensor{}
|
||||
s.Id = json.Number("1")
|
||||
|
||||
sims := NewSensorItemMappingService()
|
||||
res, _ := sims.List(s)
|
||||
|
||||
t.Log(res)
|
||||
}
|
||||
|
||||
|
||||
func TestSensorItemMappingService_List_GoRutine(t *testing.T) {
|
||||
//s := &sensor.Sensor{}
|
||||
//s.Id = json.Number("14")
|
||||
|
||||
sims := NewSensorItemMappingService()
|
||||
|
||||
il := make([]int, 0)
|
||||
|
||||
il = append(il, 1)
|
||||
il = append(il, 2)
|
||||
il = append(il, 3)
|
||||
il = append(il, 13)
|
||||
il = append(il, 14)
|
||||
|
||||
for _, ii := range il {
|
||||
|
||||
|
||||
go func(i int) {
|
||||
s := &sensor.Sensor{}
|
||||
s.Id = json.Number(strconv.Itoa(ii))
|
||||
res, _ := sims.List(s)
|
||||
fmt.Print(res)
|
||||
}(ii)
|
||||
|
||||
|
||||
}
|
||||
|
||||
wg := sync.WaitGroup{}
|
||||
|
||||
wg.Add(1)
|
||||
|
||||
|
||||
wg.Wait()
|
||||
|
||||
//res, _ := sims.List(s)
|
||||
//
|
||||
//t.Log(res)
|
||||
}
|
37
proxy/service.go
Normal file
37
proxy/service.go
Normal file
|
@ -0,0 +1,37 @@
|
|||
package proxy
|
||||
|
||||
import (
|
||||
"log"
|
||||
pb "git.loafle.net/overflow/overflow_api_db/build/golang"
|
||||
"google.golang.org/grpc"
|
||||
"golang.org/x/net/context"
|
||||
|
||||
)
|
||||
|
||||
|
||||
func InvokeDB(targetDb, methodName string, param map[string]string) (string, error) {
|
||||
|
||||
in := &pb.DBInput{}
|
||||
in.TargetDao = targetDb
|
||||
in.Method = methodName
|
||||
in.Param = param
|
||||
|
||||
conn, err := grpc.Dial(":50006", grpc.WithInsecure())
|
||||
|
||||
if err != nil {
|
||||
//log.Fatal("Rpc Error: ", err)
|
||||
return "", err
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
client := pb.NewDBClient(conn)
|
||||
out, err := client.Exec(context.Background(), in)
|
||||
if err != nil {
|
||||
//log.Fatal("Rpc Client Error: ", err)
|
||||
return "", err
|
||||
}
|
||||
log.Print(out)
|
||||
|
||||
return out.Result, nil
|
||||
}
|
||||
|
12
proxy/session/session.go
Normal file
12
proxy/session/session.go
Normal file
|
@ -0,0 +1,12 @@
|
|||
package session
|
||||
|
||||
import "git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
|
||||
//FIXME:: test session member
|
||||
func GetSessionMember() *member.Member {
|
||||
|
||||
m := member.NewMember()
|
||||
m.Id = "1";
|
||||
|
||||
return m;
|
||||
}
|
134
proxy/target/target_service.go
Normal file
134
proxy/target/target_service.go
Normal file
|
@ -0,0 +1,134 @@
|
|||
package target
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/commons_go/model/timestamp"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
|
||||
"fmt"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/utils"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/session"
|
||||
)
|
||||
|
||||
type Target struct {
|
||||
Id json.Number `json:"id,Number,omitempty"`
|
||||
Ip int64 `json:"ip,omitempty"`
|
||||
Port int `json:"port,omitempty"`
|
||||
TargetType string `json:"targetType,omitempty"`
|
||||
VendorName string `json:"vendorName,omitempty"`
|
||||
Kinds string `json:"kinds,omitempty"`
|
||||
Version string `json:"version,omitempty"`
|
||||
CreateDate timestamp.Timestamp `json:"createDate,omitempty"`
|
||||
PortType string `json:"portType,omitempty"`
|
||||
Member *member.Member `json:"member,omitempty"`
|
||||
|
||||
}
|
||||
|
||||
type TargetService struct {
|
||||
|
||||
}
|
||||
|
||||
func NewTargetService() *TargetService {
|
||||
return &TargetService{}
|
||||
}
|
||||
|
||||
func (t *TargetService)GetModel() interface{} {
|
||||
return &Target{}
|
||||
}
|
||||
|
||||
func (t *TargetService)List(tm *Target) (string, error) {
|
||||
|
||||
tm.Member.Id = session.GetSessionMember().Id
|
||||
|
||||
bytes, err := json.Marshal(tm)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
m := make(map[string]string)
|
||||
m["com.loafle.overflow.target.model.Target"] = string(bytes)
|
||||
|
||||
out, err := proxy.InvokeDB("target", "findAll", m)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, err;
|
||||
}
|
||||
|
||||
func (t *TargetService)Create(tm *Target) (string,error) {
|
||||
|
||||
//bytes, err := json.Marshal(tm)
|
||||
//
|
||||
//if err != nil {
|
||||
// return ""
|
||||
//}
|
||||
//
|
||||
//m := make(map[string]string)
|
||||
//m["com.loafle.overflow.target.model.Target"] = string(bytes)
|
||||
//
|
||||
//out := proxy.InvokeDB("target", "create", m)
|
||||
|
||||
out, err := utils.InvokeDB("target", "create", tm)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
return out, nil
|
||||
|
||||
}
|
||||
|
||||
func (t *TargetService)CreateAll(tmlist *[]*Target) (string,error) {
|
||||
|
||||
|
||||
|
||||
outlist := make([]string, 0)
|
||||
for _, ttt := range *tmlist {
|
||||
|
||||
ttt.Member = session.GetSessionMember()
|
||||
out,err := t.Create(ttt)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
outlist = append(outlist, out)
|
||||
}
|
||||
|
||||
bytes,err := json.Marshal(outlist)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return string(bytes), nil
|
||||
|
||||
}
|
||||
|
||||
func (t *TargetService)CreateListTT(tmlist *[]*Target) (string, error) {
|
||||
bytes, err := json.Marshal(tmlist)
|
||||
|
||||
if err != nil {
|
||||
return "",err
|
||||
}
|
||||
|
||||
m := make(map[string]string)
|
||||
m["java.util.List"] = string(bytes)
|
||||
|
||||
fmt.Println(string(bytes))
|
||||
out, err := proxy.InvokeDB("target", "createAll", m)
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
//
|
||||
//
|
||||
return out, nil;
|
||||
//return ""
|
||||
}
|
114
proxy/target/target_service_test.go
Normal file
114
proxy/target/target_service_test.go
Normal file
|
@ -0,0 +1,114 @@
|
|||
package target
|
||||
|
||||
import (
|
||||
"testing"
|
||||
//"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
|
||||
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy/member"
|
||||
|
||||
)
|
||||
|
||||
func TestCreateTarget(t *testing.T) {
|
||||
|
||||
|
||||
tt := Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL0000000",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
}
|
||||
|
||||
ts := NewTargetService()
|
||||
|
||||
|
||||
ts.Create(&tt)
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
func TestFindAll(t *testing.T) {
|
||||
tt := Target{
|
||||
Member:&member.Member{Id:"1"},
|
||||
}
|
||||
|
||||
ts := NewTargetService()
|
||||
|
||||
|
||||
str := ts.List(&tt)
|
||||
t.Log(str)
|
||||
}
|
||||
|
||||
|
||||
func TestCreateAll(t *testing.T) {
|
||||
|
||||
tl := make([]*Target, 0)
|
||||
|
||||
tl = append(tl, &Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL2222",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
})
|
||||
|
||||
tl = append(tl, &Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL3333",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
})
|
||||
|
||||
tl = append(tl, &Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL4444",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
})
|
||||
|
||||
tl = append(tl, &Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL5555",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
})
|
||||
|
||||
tl = append(tl, &Target{
|
||||
Ip:3232235882,
|
||||
Port:5432,
|
||||
TargetType:"DATABASE",
|
||||
Kinds:"PostgreSQL6666",
|
||||
Version:"9.5.0",
|
||||
VendorName:"PostgreSQL 9.5.0",
|
||||
PortType:"TCP",
|
||||
Member:&member.Member{Id:"1"},
|
||||
})
|
||||
|
||||
|
||||
ts := NewTargetService()
|
||||
|
||||
|
||||
ts.CreateListTT(&tl)
|
||||
|
||||
}
|
||||
|
44
proxy/utils/DBInvokeUtil.go
Normal file
44
proxy/utils/DBInvokeUtil.go
Normal file
|
@ -0,0 +1,44 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"git.loafle.net/overflow/overflow_proxy_service/proxy"
|
||||
)
|
||||
|
||||
func InvokeDB( db string, method string, obj interface{}) (string, error) {
|
||||
|
||||
var m map[string]string = nil;
|
||||
|
||||
if obj != nil {
|
||||
bytes, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
m = make(map[string]string)
|
||||
|
||||
m[GenerateModelStr(db)] = string(bytes)
|
||||
}
|
||||
|
||||
|
||||
out, err := proxy.InvokeDB(db, method, m)
|
||||
|
||||
return out, err
|
||||
}
|
||||
|
||||
func InvokeDBByModel( db string, method string, obj interface{}, model string) (string, error) {
|
||||
|
||||
bytes, err := json.Marshal(obj)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
m := make(map[string]string)
|
||||
|
||||
m[model] = string(bytes)
|
||||
|
||||
out, err := proxy.InvokeDB(db, method, m)
|
||||
|
||||
|
||||
return out, err
|
||||
}
|
21
proxy/utils/string.go
Normal file
21
proxy/utils/string.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package utils
|
||||
|
||||
import "strings"
|
||||
|
||||
const (
|
||||
defaultPackage = "com.loafle.overflow."
|
||||
modelPackageName = ".model."
|
||||
)
|
||||
|
||||
func GenerateModelStr(model string) string {
|
||||
|
||||
tm := strings.Title(model)
|
||||
|
||||
|
||||
res := defaultPackage
|
||||
res += model
|
||||
res += modelPackageName
|
||||
res += tm
|
||||
|
||||
return res
|
||||
}
|
38
proxy/utils/string_test.go
Normal file
38
proxy/utils/string_test.go
Normal file
|
@ -0,0 +1,38 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func TestStringUpper(t *testing.T) {
|
||||
|
||||
res := "crawlerInputItem"
|
||||
|
||||
aa := strings.Title(res)
|
||||
|
||||
|
||||
t.Log(aa)
|
||||
|
||||
|
||||
}
|
||||
|
||||
func TestGM(t *testing.T) {
|
||||
|
||||
t.Log(GenerateModelStr("target"))
|
||||
|
||||
}
|
||||
|
||||
|
||||
func TestNil(t *testing.T) {
|
||||
|
||||
var oo interface{}
|
||||
|
||||
oo = nil;
|
||||
|
||||
if oo == nil {
|
||||
t.Log("nil!!!")
|
||||
}
|
||||
|
||||
|
||||
}
|
20
rpc_main.go
Normal file
20
rpc_main.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"git.loafle.net/overflow/overflow_gateway_service/gateway"
|
||||
"flag"
|
||||
"github.com/golang/glog"
|
||||
"git.loafle.net/overflow/overflow_gateway_service/server"
|
||||
)
|
||||
|
||||
|
||||
func main() {
|
||||
flag.Parse()
|
||||
defer glog.Flush()
|
||||
|
||||
gateway.InitServices()
|
||||
|
||||
if err := server.RunRpc(); err != nil {
|
||||
glog.Fatal("Gateway Server Failed: ", err)
|
||||
}
|
||||
}
|
58
server/gwrpc.go
Normal file
58
server/gwrpc.go
Normal file
|
@ -0,0 +1,58 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"golang.org/x/net/context"
|
||||
"github.com/grpc-ecosystem/grpc-gateway/runtime"
|
||||
"google.golang.org/grpc"
|
||||
pb "git.loafle.net/overflow/overflow_api_service/grpc"
|
||||
"net/http"
|
||||
"strings"
|
||||
"github.com/golang/glog"
|
||||
)
|
||||
|
||||
var (
|
||||
overflowEndpoint = flag.String("echo_endpoint", ":9090", "/v1/overflow/services")
|
||||
)
|
||||
|
||||
func RunGwRpc() (err error) {
|
||||
ctx := context.Background()
|
||||
ctx, cancel := context.WithCancel(ctx)
|
||||
defer cancel()
|
||||
|
||||
mux := runtime.NewServeMux()
|
||||
opts := []grpc.DialOption{grpc.WithInsecure()}
|
||||
|
||||
err = pb.RegisterOverflowGatewayHandlerFromEndpoint(ctx, mux, *overflowEndpoint, opts)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return http.ListenAndServe(":8080", allowCORS(mux))
|
||||
}
|
||||
|
||||
|
||||
//https://github.com/grpc-ecosystem/grpc-gateway/blob/master/examples/main.go
|
||||
|
||||
func allowCORS(h http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if origin := r.Header.Get("Origin"); origin != "" {
|
||||
w.Header().Set("Access-Control-Allow-Origin", origin)
|
||||
if r.Method == "OPTIONS" && r.Header.Get("Access-Control-Request-Method") != "" {
|
||||
preflightHandler(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
h.ServeHTTP(w, r)
|
||||
})
|
||||
}
|
||||
|
||||
func preflightHandler(w http.ResponseWriter, r *http.Request) {
|
||||
headers := []string{"Content-Type", "Accept"}
|
||||
w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ","))
|
||||
methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"}
|
||||
w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ","))
|
||||
glog.Infof("preflight request for %s", r.URL.Path)
|
||||
return
|
||||
}
|
23
server/rpc.go
Normal file
23
server/rpc.go
Normal file
|
@ -0,0 +1,23 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"net"
|
||||
"google.golang.org/grpc"
|
||||
pb "git.loafle.net/overflow/overflow_api_service/grpc"
|
||||
"git.loafle.net/overflow/overflow_gateway_service/gateway"
|
||||
)
|
||||
|
||||
func RunRpc() error {
|
||||
l, err := net.Listen("tcp", ":9090")
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
s := grpc.NewServer()
|
||||
|
||||
pb.RegisterOverflowGatewayServer(s, &gateway.ServiceImpl{})
|
||||
s.Serve(l)
|
||||
|
||||
return nil
|
||||
}
|
119
server/rpc_test.go
Normal file
119
server/rpc_test.go
Normal file
|
@ -0,0 +1,119 @@
|
|||
package server
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"git.loafle.net/overflow/overflow_gateway_service/gateway"
|
||||
"flag"
|
||||
"github.com/golang/glog"
|
||||
"time"
|
||||
"fmt"
|
||||
"os"
|
||||
"net/http"
|
||||
"bytes"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"google.golang.org/grpc"
|
||||
pb "git.loafle.net/overflow/overflow_api_service/grpc"
|
||||
"golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func startRpcServerTest() <- chan error{
|
||||
ch := make(chan error, 2)
|
||||
go func() {
|
||||
if err := RunRpc(); err != nil {
|
||||
ch <- fmt.Errorf("cannot run grpc service: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
go func() {
|
||||
if err := RunGwRpc(); err != nil {
|
||||
ch <- fmt.Errorf("cannot run gateway service: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
return ch
|
||||
}
|
||||
|
||||
func callGatewayRpc() string {
|
||||
time.Sleep(2 * time.Second)
|
||||
|
||||
url := "http://localhost:8080/v1/overflow/services"
|
||||
glog.Infoln("URL : ", url)
|
||||
|
||||
var jsonStr = []byte(`{"serviceName":"Member","methodName":"Regist","param":{"email":"geek@loafle.com","password":"qwer5795"}}`)
|
||||
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr))
|
||||
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
|
||||
req.Header.Set("X-Custom-Header", "myvalue")
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
client := &http.Client{}
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
glog.Error(err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
log.Println("response Status:", resp.Status)
|
||||
log.Println("response Headers:", resp.Header)
|
||||
body, _ := ioutil.ReadAll(resp.Body)
|
||||
log.Println("response Body:", string(body))
|
||||
|
||||
return string(body)
|
||||
}
|
||||
|
||||
func TestRpcServer(t *testing.T) {
|
||||
|
||||
flag.Parse()
|
||||
defer glog.Flush()
|
||||
|
||||
gateway.InitServices()
|
||||
|
||||
errch := startRpcServerTest()
|
||||
|
||||
chStr := make(chan string , 1)
|
||||
|
||||
go func() {
|
||||
chStr <- callGatewayRpc()
|
||||
}()
|
||||
|
||||
|
||||
select {
|
||||
case err := <- errch:
|
||||
log.Println(err)
|
||||
os.Exit(1)
|
||||
case status := <-chStr:
|
||||
log.Println( status)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func TestRPC(t *testing.T) {
|
||||
|
||||
|
||||
conn, err := grpc.Dial(":9090", grpc.WithInsecure());
|
||||
|
||||
if err != nil {
|
||||
t.Log(err)
|
||||
}
|
||||
|
||||
|
||||
client := pb.NewOverflowGatewayClient(conn)
|
||||
|
||||
si := pb.ServiceInput{}
|
||||
si.MethodName = "create"
|
||||
si.ServiceName = "member"
|
||||
si.Param = make(map[string]string)
|
||||
si.Param["1"] = "2222"
|
||||
|
||||
so, err := client.ExecServices(context.Background(), &si)
|
||||
|
||||
t.Log(so.ResultStr)
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user