From d47368c3ae0cf0cdc4165d04b5aa02672e46d6b9 Mon Sep 17 00:00:00 2001 From: Hoang Date: Fri, 5 Nov 2021 14:21:57 +0700 Subject: [PATCH 1/4] add createMethod --- .gitignore | 2 + action_create.go | 130 ++++++++++++++++++++++++++++++++ auth_token.go | 17 +++++ constant.go | 11 +++ devicemngt.go | 65 ++++++++++++++++ go.mod | 46 ++++++++++++ go.sum | 188 +++++++++++++++++++++++++++++++++++++++++++++++ helper.go | 12 +++ model.go | 24 ++++++ time.go | 20 +++++ 10 files changed, 515 insertions(+) create mode 100644 action_create.go create mode 100644 auth_token.go create mode 100644 constant.go create mode 100644 devicemngt.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 helper.go create mode 100644 model.go create mode 100644 time.go diff --git a/.gitignore b/.gitignore index 66fd13c..398baf2 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ # Dependency directories (remove the comment below to include it) # vendor/ + +.idea diff --git a/action_create.go b/action_create.go new file mode 100644 index 0000000..8b23c5b --- /dev/null +++ b/action_create.go @@ -0,0 +1,130 @@ +package devicemngmt + +import ( + "context" + "errors" + + "github.com/Selly-Modules/logger" + "github.com/Selly-Modules/mongodb" + ua "github.com/mssola/user_agent" + "go.mongodb.org/mongo-driver/bson" +) + +// DeviceCreate ... +type DeviceCreate struct { + DeviceID string + UserID string + UserAgent string + AppVersion string + IP string + FCMToken string + Language string +} + +// Create ... +func (s Service) Create(payload DeviceCreate) error { + var ( + col = s.getDeviceCollection() + ctx = context.Background() + ) + + // New device data from payload + deviceData, err := payload.newDevice() + if err != nil { + return err + } + + // Find device id existed or not + device := Device{} + if err = col.FindOne(ctx, bson.M{"deviceID": deviceData.DeviceID}).Decode(&device); err != nil { + logger.Error("devicemngt - findByDeviceID", logger.LogData{ + "deviceID": deviceData.DeviceID, + "err": err.Error(), + }) + } + if !device.ID.IsZero() { + return errors.New("deviceID already exists") + } + + // Create device + _, err = col.InsertOne(ctx, deviceData) + if err != nil { + logger.Error("devicemngt - Create ", logger.LogData{ + "doc": deviceData, + "err": err.Error(), + }) + return errors.New("create device fail") + } + + return nil +} + +func (payload DeviceCreate) newDevice() (result Device, err error) { + timeNow := now() + device := Device{ + ID: mongodb.NewObjectID(), + LastActivityAt: timeNow, + CreatedAt: timeNow, + FCMToken: payload.FCMToken, + } + + // Set deviceID + if payload.DeviceID == "" { + logger.Error("devicemngt - Create: no deviceID data", logger.LogData{ + "payload": payload, + }) + err = errors.New("no deviceID data") + return + } + device.DeviceID = payload.DeviceID + + // OSName, OSVersion + if payload.UserAgent == "" { + logger.Error("devicemngt - Create: no userAgent data", logger.LogData{ + "payload": payload, + }) + err = errors.New("no userAgent data") + return + } + uaData := ua.New(payload.UserAgent) + device.OSName = uaData.OSInfo().Name + device.OSVersion = uaData.OSInfo().Version + + // App version + if payload.AppVersion != "" { + device.AppVersion = payload.AppVersion + device.IsMobile = true + } + + // IP + if payload.IP == "" { + logger.Error("devicemngt - Create: no ip data", logger.LogData{ + "payload": payload, + }) + err = errors.New("no ip data") + return + } + + // Language, default is vietnamese(vi) + if payload.Language == "" { + device.Language = viLanguage + } else { + device.Language = enLanguage + } + + // userIDe + userID, _ := mongodb.NewIDFromString(payload.UserID) + if userID.IsZero() { + logger.Error("devicemngt - Create: invalid userID data", logger.LogData{ + "payload": payload, + }) + err = errors.New("invalid userID data") + return + } + + // Generate authToken from userID + device.AuthToken = s.generateAuthToken(userID) + + result = device + return +} diff --git a/auth_token.go b/auth_token.go new file mode 100644 index 0000000..88c7ddd --- /dev/null +++ b/auth_token.go @@ -0,0 +1,17 @@ +package devicemngmt + +import ( + "time" + + "github.com/dgrijalva/jwt-go" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +func (s Service) generateAuthToken(userID primitive.ObjectID) string { + token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ + "_id": userID, + "exp": now().Add(time.Second * 15552000).Unix(), // 6 months + }) + tokenString, _ := token.SignedString([]byte(s.AuthSecret)) + return tokenString +} diff --git a/constant.go b/constant.go new file mode 100644 index 0000000..a6e1949 --- /dev/null +++ b/constant.go @@ -0,0 +1,11 @@ +package devicemngmt + +// Constant ... +const ( + TableDevice = "devices" + + timezoneHCM = "Asia/Ho_Chi_Minh" + + viLanguage = "vi" + enLanguage = "en" +) diff --git a/devicemngt.go b/devicemngt.go new file mode 100644 index 0000000..3574ec1 --- /dev/null +++ b/devicemngt.go @@ -0,0 +1,65 @@ +package devicemngmt + +import ( + "errors" + "fmt" + + "github.com/Selly-Modules/mongodb" + "go.mongodb.org/mongo-driver/mongo" +) + +// MongoDBConfig ... +type MongoDBConfig struct { + Host, User, Password, DBName, mechanism, source string +} + +// Config ... +type Config struct { + // MongoDB config, for save documents + MongoDB MongoDBConfig + // Table prefix, each service has its own prefix + TablePrefix string + // Auth secret, used to sign token + AuthSecret string +} + +// Service ... +type Service struct { + Config + DB *mongo.Database +} + +var s *Service + +// Init ... +func Init(config Config) error { + if config.MongoDB.Host == "" || config.TablePrefix == "" || config.AuthSecret == "" { + return errors.New("please provide all necessary information for init device") + } + + // Connect MongoDB + db, err := mongodb.Connect( + config.MongoDB.Host, + config.MongoDB.User, + config.MongoDB.Password, + config.MongoDB.DBName, + config.MongoDB.mechanism, + config.MongoDB.source, + ) + if err != nil { + fmt.Println("Cannot init module DEVICE MANAGEMENT", err) + return err + } + + s = &Service{ + Config: config, + DB: db, + } + + return nil +} + +// GetInstance ... +func GetInstance() *Service { + return s +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..42f5b90 --- /dev/null +++ b/go.mod @@ -0,0 +1,46 @@ +module github.com/selly-Modules/devicemngmt + +go 1.17 + +require ( + github.com/Selly-Modules/logger v0.0.0-20210809034923-140a51f39ec9 + github.com/Selly-Modules/mongodb v0.0.0-20211013094205-a8ab24a96c4c + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/mssola/user_agent v0.5.3 + go.mongodb.org/mongo-driver v1.7.4 +) + +require ( + github.com/armon/go-radix v1.0.0 // indirect + github.com/elastic/go-licenser v0.3.1 // indirect + github.com/elastic/go-sysinfo v1.1.1 // indirect + github.com/elastic/go-windows v1.0.0 // indirect + github.com/go-stack/stack v1.8.0 // indirect + github.com/golang/snappy v0.0.1 // indirect + github.com/jcchavezs/porto v0.1.0 // indirect + github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect + github.com/klauspost/compress v1.13.6 // indirect + github.com/logrusorgru/aurora v2.0.3+incompatible // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0 // indirect + github.com/santhosh-tekuri/jsonschema v1.2.4 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.0.2 // indirect + github.com/xdg-go/stringprep v1.0.2 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + go.elastic.co/apm v1.13.1 // indirect + go.elastic.co/apm/module/apmzap v1.13.1 // indirect + go.elastic.co/fastjson v1.1.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.18.1 // indirect + golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 // indirect + golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect + golang.org/x/mod v0.3.0 // indirect + golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect + golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5 // indirect + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect + howett.net/plist v0.0.0-20181124034731-591f970eefbb // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9d4204b --- /dev/null +++ b/go.sum @@ -0,0 +1,188 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Selly-Modules/logger v0.0.0-20210809034923-140a51f39ec9 h1:AuJ/IIZ7yppyP19ILEYkwz26CwGXR4xUyXANKSG0+1U= +github.com/Selly-Modules/logger v0.0.0-20210809034923-140a51f39ec9/go.mod h1:RWhSQ3F01an8KD00VjzRBZOMcE5eV2Cy0/l4ZkeieyU= +github.com/Selly-Modules/mongodb v0.0.0-20211013094205-a8ab24a96c4c h1:1l6QmAl43maG9zFyUXrPQVUjyVt0vy/2Saz992UR+Sc= +github.com/Selly-Modules/mongodb v0.0.0-20211013094205-a8ab24a96c4c/go.mod h1:C9O0Bgl9i6szjntMjBdEvaFSqG2UPOgHUspIWIJ93JQ= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/elastic/go-licenser v0.3.1 h1:RmRukU/JUmts+rpexAw0Fvt2ly7VVu6mw8z4HrEzObU= +github.com/elastic/go-licenser v0.3.1/go.mod h1:D8eNQk70FOCVBl3smCGQt/lv7meBeQno2eI1S5apiHQ= +github.com/elastic/go-sysinfo v1.1.1 h1:ZVlaLDyhVkDfjwPGU55CQRCRolNpc7P0BbyhhQZQmMI= +github.com/elastic/go-sysinfo v1.1.1/go.mod h1:i1ZYdU10oLNfRzq4vq62BEwD2fH8KaWh6eh0ikPT9F0= +github.com/elastic/go-windows v1.0.0 h1:qLURgZFkkrYyTTkvYpsZIgf83AUsdIHfvlJaqaZ7aSY= +github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= +github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= +github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= +github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= +github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= +github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= +github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= +github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= +github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= +github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= +github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= +github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= +github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= +github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= +github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= +github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jcchavezs/porto v0.1.0 h1:Xmxxn25zQMmgE7/yHYmh19KcItG81hIwfbEEFnd6w/Q= +github.com/jcchavezs/porto v0.1.0/go.mod h1:fESH0gzDHiutHRdX2hv27ojnOVFco37hg1W6E9EZF4A= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= +github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= +github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mssola/user_agent v0.5.3 h1:lBRPML9mdFuIZgI2cmlQ+atbpJdLdeVl2IDodjBR578= +github.com/mssola/user_agent v0.5.3/go.mod h1:TTPno8LPY3wAIEKRpAtkdMT0f8SE24pLRGPahjCH4uw= +github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0 h1:c8R11WC8m7KNMkTv/0+Be8vvwo4I3/Ut9AC2FW8fX3U= +github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis= +github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= +github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.elastic.co/apm v1.13.1 h1:ICIcUcQOImg/bve9mQVyLCvm1cSUZ1afdwK6ACnxczU= +go.elastic.co/apm v1.13.1/go.mod h1:dylGv2HKR0tiCV+wliJz1KHtDyuD8SPe69oV7VyK6WY= +go.elastic.co/apm/module/apmzap v1.13.1 h1:Soa4vNYYabPvOW1vm1A00C0UcEmfEzcx3YBjAgf5ue4= +go.elastic.co/apm/module/apmzap v1.13.1/go.mod h1:Tu8/TwffpBoNGmI05VcL1Ye2AC8oXrlMKNaKD1TIQy0= +go.elastic.co/fastjson v1.1.0 h1:3MrGBWWVIxe/xvsbpghtkFoPciPhOCmjsR/HfwEeQR4= +go.elastic.co/fastjson v1.1.0/go.mod h1:boNGISWMjQsUPy/t6yqt2/1Wx4YNPSe+mZjlyw9vKKI= +go.mongodb.org/mongo-driver v1.7.1/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= +go.mongodb.org/mongo-driver v1.7.4 h1:sllcioag8Mec0LYkftYWq+cKNPIR4Kqq3iv9ZXY0g/E= +go.mongodb.org/mongo-driver v1.7.4/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.18.1 h1:CSUJ2mjFszzEWt4CdKISEuChVIXGBn3lAPwkRGyVrc4= +go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e h1:9vRrk9YW2BTzLP0VCB9ZDjU4cPqkg+IDWL7XgxA1yxQ= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5 h1:MeC2gMlMdkd67dn17MEby3rGXRxZtWeiRXOnISfTQ74= +golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= +howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= diff --git a/helper.go b/helper.go new file mode 100644 index 0000000..9b7a54f --- /dev/null +++ b/helper.go @@ -0,0 +1,12 @@ +package devicemngmt + +import ( + "fmt" + + "go.mongodb.org/mongo-driver/mongo" +) + +// getDeviceCollection ... +func (s Service) getDeviceCollection() *mongo.Collection { + return s.DB.Collection(fmt.Sprintf("%s-%s", s.TablePrefix, TableDevice)) +} diff --git a/model.go b/model.go new file mode 100644 index 0000000..bd684f3 --- /dev/null +++ b/model.go @@ -0,0 +1,24 @@ +package devicemngmt + +import ( + "time" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +// Device ... +type Device struct { + ID primitive.ObjectID `bson:"_id"` + DeviceID string `bson:"deviceID"` // unique + IP string `bson:"ip"` + OSName string `bson:"osName"` + OSVersion string `bson:"osVersion"` + AppVersion string `bson:"appVersion"` + Language string `bson:"language"` // vi, en + IsMobile bool `bson:"isMobile"` + LastActivityAt time.Time `bson:"lastActivityAt"` + UserID primitive.ObjectID `bson:"userID"` + AuthToken string `bson:"authToken"` + FCMToken string `bson:"fcmToken"` + CreatedAt time.Time `bson:"createdAt"` +} diff --git a/time.go b/time.go new file mode 100644 index 0000000..4669e7c --- /dev/null +++ b/time.go @@ -0,0 +1,20 @@ +package devicemngmt + +import "time" + +// +// NOTE: due to unique timezone in server's code, all using time will be convert to HCM timezone (UTC +7) +// All functions generate time, must be call util functions here +// WARNING: don't accept call time.Now() directly +// + +// getHCMLocation ... +func getHCMLocation() *time.Location { + l, _ := time.LoadLocation(timezoneHCM) + return l +} + +// now ... +func now() time.Time { + return time.Now().In(getHCMLocation()) +} From 6e0eb8b415585eedda48ac47e682409584f0a611 Mon Sep 17 00:00:00 2001 From: Hoang Date: Fri, 5 Nov 2021 15:40:07 +0700 Subject: [PATCH 2/4] fix comment --- action_create.go | 78 +++++++++++++----------------------------------- auth_token.go | 17 ----------- constant.go | 6 ++-- devicemngt.go | 12 ++++---- helper.go | 21 ++++++++++++- model.go | 26 ++++++++-------- validate.go | 51 +++++++++++++++++++++++++++++++ 7 files changed, 112 insertions(+), 99 deletions(-) delete mode 100644 auth_token.go create mode 100644 validate.go diff --git a/action_create.go b/action_create.go index 8b23c5b..2781186 100644 --- a/action_create.go +++ b/action_create.go @@ -3,31 +3,38 @@ package devicemngmt import ( "context" "errors" + "fmt" "github.com/Selly-Modules/logger" "github.com/Selly-Modules/mongodb" - ua "github.com/mssola/user_agent" "go.mongodb.org/mongo-driver/bson" ) -// DeviceCreate ... -type DeviceCreate struct { +// CreateOptions ... +type CreateOptions struct { DeviceID string UserID string UserAgent string AppVersion string IP string FCMToken string + AuthToken string Language string } // Create ... -func (s Service) Create(payload DeviceCreate) error { +func (s Service) Create(payload CreateOptions) error { var ( col = s.getDeviceCollection() ctx = context.Background() ) + // Validate payload + err := payload.validate() + if err != nil { + return err + } + // New device data from payload deviceData, err := payload.newDevice() if err != nil { @@ -43,7 +50,7 @@ func (s Service) Create(payload DeviceCreate) error { }) } if !device.ID.IsZero() { - return errors.New("deviceID already exists") + return errors.New("this device is already existed") } // Create device @@ -53,78 +60,33 @@ func (s Service) Create(payload DeviceCreate) error { "doc": deviceData, "err": err.Error(), }) - return errors.New("create device fail") + return fmt.Errorf("error when create device: %s", err.Error()) } return nil } -func (payload DeviceCreate) newDevice() (result Device, err error) { +func (payload CreateOptions) newDevice() (result Device, err error) { timeNow := now() device := Device{ ID: mongodb.NewObjectID(), + DeviceID: payload.DeviceID, + OSName: getOSName(payload.UserAgent), + OSVersion: getOSVersion(payload.UserAgent), + IP: payload.IP, + Language: getLanguage(payload.Language), + AuthToken: payload.AuthToken, LastActivityAt: timeNow, CreatedAt: timeNow, FCMToken: payload.FCMToken, } - // Set deviceID - if payload.DeviceID == "" { - logger.Error("devicemngt - Create: no deviceID data", logger.LogData{ - "payload": payload, - }) - err = errors.New("no deviceID data") - return - } - device.DeviceID = payload.DeviceID - - // OSName, OSVersion - if payload.UserAgent == "" { - logger.Error("devicemngt - Create: no userAgent data", logger.LogData{ - "payload": payload, - }) - err = errors.New("no userAgent data") - return - } - uaData := ua.New(payload.UserAgent) - device.OSName = uaData.OSInfo().Name - device.OSVersion = uaData.OSInfo().Version - // App version if payload.AppVersion != "" { device.AppVersion = payload.AppVersion device.IsMobile = true } - // IP - if payload.IP == "" { - logger.Error("devicemngt - Create: no ip data", logger.LogData{ - "payload": payload, - }) - err = errors.New("no ip data") - return - } - - // Language, default is vietnamese(vi) - if payload.Language == "" { - device.Language = viLanguage - } else { - device.Language = enLanguage - } - - // userIDe - userID, _ := mongodb.NewIDFromString(payload.UserID) - if userID.IsZero() { - logger.Error("devicemngt - Create: invalid userID data", logger.LogData{ - "payload": payload, - }) - err = errors.New("invalid userID data") - return - } - - // Generate authToken from userID - device.AuthToken = s.generateAuthToken(userID) - result = device return } diff --git a/auth_token.go b/auth_token.go deleted file mode 100644 index 88c7ddd..0000000 --- a/auth_token.go +++ /dev/null @@ -1,17 +0,0 @@ -package devicemngmt - -import ( - "time" - - "github.com/dgrijalva/jwt-go" - "go.mongodb.org/mongo-driver/bson/primitive" -) - -func (s Service) generateAuthToken(userID primitive.ObjectID) string { - token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ - "_id": userID, - "exp": now().Add(time.Second * 15552000).Unix(), // 6 months - }) - tokenString, _ := token.SignedString([]byte(s.AuthSecret)) - return tokenString -} diff --git a/constant.go b/constant.go index a6e1949..ca4c13f 100644 --- a/constant.go +++ b/constant.go @@ -2,10 +2,10 @@ package devicemngmt // Constant ... const ( - TableDevice = "devices" + tableDevice = "devices" timezoneHCM = "Asia/Ho_Chi_Minh" - viLanguage = "vi" - enLanguage = "en" + langVi = "vi" + langEn = "en" ) diff --git a/devicemngt.go b/devicemngt.go index 3574ec1..cc2b7e7 100644 --- a/devicemngt.go +++ b/devicemngt.go @@ -19,8 +19,6 @@ type Config struct { MongoDB MongoDBConfig // Table prefix, each service has its own prefix TablePrefix string - // Auth secret, used to sign token - AuthSecret string } // Service ... @@ -32,9 +30,9 @@ type Service struct { var s *Service // Init ... -func Init(config Config) error { - if config.MongoDB.Host == "" || config.TablePrefix == "" || config.AuthSecret == "" { - return errors.New("please provide all necessary information for init device") +func Init(config Config) (*Service, error) { + if config.MongoDB.Host == "" || config.TablePrefix == "" { + return nil, errors.New("please provide all necessary information for init device") } // Connect MongoDB @@ -48,7 +46,7 @@ func Init(config Config) error { ) if err != nil { fmt.Println("Cannot init module DEVICE MANAGEMENT", err) - return err + return nil, err } s = &Service{ @@ -56,7 +54,7 @@ func Init(config Config) error { DB: db, } - return nil + return s, nil } // GetInstance ... diff --git a/helper.go b/helper.go index 9b7a54f..3c1d026 100644 --- a/helper.go +++ b/helper.go @@ -3,10 +3,29 @@ package devicemngmt import ( "fmt" + ua "github.com/mssola/user_agent" "go.mongodb.org/mongo-driver/mongo" ) // getDeviceCollection ... func (s Service) getDeviceCollection() *mongo.Collection { - return s.DB.Collection(fmt.Sprintf("%s-%s", s.TablePrefix, TableDevice)) + return s.DB.Collection(fmt.Sprintf("%s-%s", s.TablePrefix, tableDevice)) +} + +func getOSName(userAgent string) string { + uaData := ua.New(userAgent) + return uaData.OSInfo().Name +} + +func getOSVersion(userAgent string) string { + uaData := ua.New(userAgent) + return uaData.OSInfo().Version +} + +func getLanguage(lang string) string { + // Language, default is vietnamese(vi) + if lang == langEn { + return langEn + } + return langVi } diff --git a/model.go b/model.go index bd684f3..22a2796 100644 --- a/model.go +++ b/model.go @@ -8,17 +8,17 @@ import ( // Device ... type Device struct { - ID primitive.ObjectID `bson:"_id"` - DeviceID string `bson:"deviceID"` // unique - IP string `bson:"ip"` - OSName string `bson:"osName"` - OSVersion string `bson:"osVersion"` - AppVersion string `bson:"appVersion"` - Language string `bson:"language"` // vi, en - IsMobile bool `bson:"isMobile"` - LastActivityAt time.Time `bson:"lastActivityAt"` - UserID primitive.ObjectID `bson:"userID"` - AuthToken string `bson:"authToken"` - FCMToken string `bson:"fcmToken"` - CreatedAt time.Time `bson:"createdAt"` + ID primitive.ObjectID `bson:"_id" json:"_id"` + DeviceID string `bson:"deviceID" json:"deviceID"` // unique + IP string `bson:"ip" json:"ip"` + OSName string `bson:"osName" json:"osName"` + OSVersion string `bson:"osVersion" json:"osVersion"` + AppVersion string `bson:"appVersion" json:"appVersion"` + Language string `bson:"language" json:"language"` // vi, en + IsMobile bool `bson:"isMobile" json:"isMobile"` + LastActivityAt time.Time `bson:"lastActivityAt" json:"lastActivityAt"` + UserID primitive.ObjectID `bson:"userID" json:"userID"` + AuthToken string `bson:"authToken" json:"authToken"` + FCMToken string `bson:"fcmToken" json:"fcmToken"` + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` } diff --git a/validate.go b/validate.go new file mode 100644 index 0000000..9efc49f --- /dev/null +++ b/validate.go @@ -0,0 +1,51 @@ +package devicemngmt + +import ( + "errors" + + "github.com/Selly-Modules/logger" +) + +func (co CreateOptions) validate() error{ + // DeviceID + if co.DeviceID == "" { + logger.Error("devicemngt - Create: no deviceID data", logger.LogData{ + "payload": co, + }) + return errors.New("no deviceID data") + } + + // UserAgent + if co.UserAgent == "" { + logger.Error("devicemngt - Create: no userAgent data", logger.LogData{ + "payload": co, + }) + return errors.New("no userAgent data") + } + + // IP + if co.IP == "" { + logger.Error("devicemngt - Create: no ip data", logger.LogData{ + "payload": co, + }) + return errors.New("no ip data") + } + + // UserID + if co.UserID == "" { + logger.Error("devicemngt - Create: no userID data", logger.LogData{ + "payload": co, + }) + return errors.New("no userID data") + } + + // AuthToken + if co.AuthToken == "" { + logger.Error("devicemngt - Create: no authToken data", logger.LogData{ + "payload": co, + }) + return errors.New("no authToken data") + } + + return nil +} From 9905ab89ae82f672602fc8b3eb821e3dd80d9a45 Mon Sep 17 00:00:00 2001 From: Hoang Date: Fri, 5 Nov 2021 16:10:12 +0700 Subject: [PATCH 3/4] fix comment again --- action_create.go | 12 ++---------- helper.go | 22 ++++++++++++++++++++++ model.go | 4 ++-- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/action_create.go b/action_create.go index 2781186..36413d8 100644 --- a/action_create.go +++ b/action_create.go @@ -7,7 +7,6 @@ import ( "github.com/Selly-Modules/logger" "github.com/Selly-Modules/mongodb" - "go.mongodb.org/mongo-driver/bson" ) // CreateOptions ... @@ -41,15 +40,8 @@ func (s Service) Create(payload CreateOptions) error { return err } - // Find device id existed or not - device := Device{} - if err = col.FindOne(ctx, bson.M{"deviceID": deviceData.DeviceID}).Decode(&device); err != nil { - logger.Error("devicemngt - findByDeviceID", logger.LogData{ - "deviceID": deviceData.DeviceID, - "err": err.Error(), - }) - } - if !device.ID.IsZero() { + // Find deviceID existed or not + if s.isDeviceIDExisted(ctx, deviceData.DeviceID) { return errors.New("this device is already existed") } diff --git a/helper.go b/helper.go index 3c1d026..3441415 100644 --- a/helper.go +++ b/helper.go @@ -1,9 +1,12 @@ package devicemngmt import ( + "context" "fmt" + "github.com/Selly-Modules/logger" ua "github.com/mssola/user_agent" + "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" ) @@ -12,6 +15,25 @@ func (s Service) getDeviceCollection() *mongo.Collection { return s.DB.Collection(fmt.Sprintf("%s-%s", s.TablePrefix, tableDevice)) } +func (s Service) isDeviceIDExisted(ctx context.Context, deviceID string) bool { + var ( + col = s.getDeviceCollection() + device = Device{} + ) + + if err := col.FindOne(ctx, bson.M{"deviceID": deviceID}).Decode(&device); err != nil { + logger.Error("devicemngt - findByDeviceID", logger.LogData{ + "deviceID": deviceID, + "err": err.Error(), + }) + } + if !device.ID.IsZero() { + return true + } + + return false +} + func getOSName(userAgent string) string { uaData := ua.New(userAgent) return uaData.OSInfo().Name diff --git a/model.go b/model.go index 22a2796..33dce53 100644 --- a/model.go +++ b/model.go @@ -9,7 +9,7 @@ import ( // Device ... type Device struct { ID primitive.ObjectID `bson:"_id" json:"_id"` - DeviceID string `bson:"deviceID" json:"deviceID"` // unique + DeviceID string `bson:"deviceID" json:"deviceId"` // unique IP string `bson:"ip" json:"ip"` OSName string `bson:"osName" json:"osName"` OSVersion string `bson:"osVersion" json:"osVersion"` @@ -17,7 +17,7 @@ type Device struct { Language string `bson:"language" json:"language"` // vi, en IsMobile bool `bson:"isMobile" json:"isMobile"` LastActivityAt time.Time `bson:"lastActivityAt" json:"lastActivityAt"` - UserID primitive.ObjectID `bson:"userID" json:"userID"` + UserID primitive.ObjectID `bson:"userID" json:"userId"` AuthToken string `bson:"authToken" json:"authToken"` FCMToken string `bson:"fcmToken" json:"fcmToken"` CreatedAt time.Time `bson:"createdAt" json:"createdAt"` From 85c9692da0b142a2a8b32b6847ece80f85ed1da8 Mon Sep 17 00:00:00 2001 From: Hoang Date: Fri, 5 Nov 2021 16:24:53 +0700 Subject: [PATCH 4/4] fix comment again --- action_create.go | 20 ++++++++++---------- helper.go | 5 +---- model.go | 26 +++++++++++++------------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/action_create.go b/action_create.go index 36413d8..eebbd0e 100644 --- a/action_create.go +++ b/action_create.go @@ -61,16 +61,16 @@ func (s Service) Create(payload CreateOptions) error { func (payload CreateOptions) newDevice() (result Device, err error) { timeNow := now() device := Device{ - ID: mongodb.NewObjectID(), - DeviceID: payload.DeviceID, - OSName: getOSName(payload.UserAgent), - OSVersion: getOSVersion(payload.UserAgent), - IP: payload.IP, - Language: getLanguage(payload.Language), - AuthToken: payload.AuthToken, - LastActivityAt: timeNow, - CreatedAt: timeNow, - FCMToken: payload.FCMToken, + ID: mongodb.NewObjectID(), + DeviceID: payload.DeviceID, + OSName: getOSName(payload.UserAgent), + OSVersion: getOSVersion(payload.UserAgent), + IP: payload.IP, + Language: getLanguage(payload.Language), + AuthToken: payload.AuthToken, + LastActivatedAt: timeNow, + CreatedAt: timeNow, + FCMToken: payload.FCMToken, } // App version diff --git a/helper.go b/helper.go index 3441415..120e9d5 100644 --- a/helper.go +++ b/helper.go @@ -26,12 +26,9 @@ func (s Service) isDeviceIDExisted(ctx context.Context, deviceID string) bool { "deviceID": deviceID, "err": err.Error(), }) - } - if !device.ID.IsZero() { return true } - - return false + return !device.ID.IsZero() } func getOSName(userAgent string) string { diff --git a/model.go b/model.go index 33dce53..7c00d78 100644 --- a/model.go +++ b/model.go @@ -8,17 +8,17 @@ import ( // Device ... type Device struct { - ID primitive.ObjectID `bson:"_id" json:"_id"` - DeviceID string `bson:"deviceID" json:"deviceId"` // unique - IP string `bson:"ip" json:"ip"` - OSName string `bson:"osName" json:"osName"` - OSVersion string `bson:"osVersion" json:"osVersion"` - AppVersion string `bson:"appVersion" json:"appVersion"` - Language string `bson:"language" json:"language"` // vi, en - IsMobile bool `bson:"isMobile" json:"isMobile"` - LastActivityAt time.Time `bson:"lastActivityAt" json:"lastActivityAt"` - UserID primitive.ObjectID `bson:"userID" json:"userId"` - AuthToken string `bson:"authToken" json:"authToken"` - FCMToken string `bson:"fcmToken" json:"fcmToken"` - CreatedAt time.Time `bson:"createdAt" json:"createdAt"` + ID primitive.ObjectID `bson:"_id" json:"_id"` + DeviceID string `bson:"deviceID" json:"deviceId"` // unique + IP string `bson:"ip" json:"ip"` + OSName string `bson:"osName" json:"osName"` + OSVersion string `bson:"osVersion" json:"osVersion"` + AppVersion string `bson:"appVersion" json:"appVersion"` + Language string `bson:"language" json:"language"` // vi, en + IsMobile bool `bson:"isMobile" json:"isMobile"` + LastActivatedAt time.Time `bson:"lastActivatedAt" json:"lastActivatedAt"` + UserID primitive.ObjectID `bson:"userID" json:"userId"` + AuthToken string `bson:"authToken" json:"authToken"` + FCMToken string `bson:"fcmToken" json:"fcmToken"` + CreatedAt time.Time `bson:"createdAt" json:"createdAt"` }