add createMethod #2
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -13,3 +13,5 @@
 | 
			
		|||
 | 
			
		||||
# Dependency directories (remove the comment below to include it)
 | 
			
		||||
# vendor/
 | 
			
		||||
 | 
			
		||||
.idea
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,84 @@
 | 
			
		|||
| 
					
 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
import (
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	"context"
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	"errors"
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	"fmt"
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	"github.com/Selly-Modules/logger"
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	"github.com/Selly-Modules/mongodb"
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
// CreateOptions ...
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
type CreateOptions struct {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	DeviceID   string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	UserID     string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	UserAgent  string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	AppVersion string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	IP         string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	FCMToken   string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	AuthToken  string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	Language   string
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		thiếu AuthToken thiếu AuthToken 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
// Create ...
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
func (s Service) Create(payload CreateOptions) error {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	var (
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		col = s.getDeviceCollection()
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		ctx = context.Background()
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	)
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	// Validate payload
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	err := payload.validate()
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	if err != nil {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		return err
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	// New device data from payload
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	deviceData, err := payload.newDevice()
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	if err != nil {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		return err
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	// Find deviceID existed or not
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	if s.isDeviceIDExisted(ctx, deviceData.DeviceID) {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		return errors.New("this device is already existed")
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	// Create device
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	_, err = col.InsertOne(ctx, deviceData)
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	if err != nil {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		logger.Error("devicemngt - Create ", logger.LogData{
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
			"doc": deviceData,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
			"err": err.Error(),
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		return fmt.Errorf("error when create device: %s", err.Error())
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	return nil
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
func (payload CreateOptions) newDevice() (result Device, err error) {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	timeNow := now()
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	device := Device{
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		ID:              mongodb.NewObjectID(),
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		DeviceID:        payload.DeviceID,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		OSName:          getOSName(payload.UserAgent),
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		OSVersion:       getOSVersion(payload.UserAgent),
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		IP:              payload.IP,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		Language:        getLanguage(payload.Language),
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		AuthToken:       payload.AuthToken,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		LastActivatedAt: timeNow,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		CreatedAt:       timeNow,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		FCMToken:        payload.FCMToken,
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	// App version
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	if payload.AppVersion != "" {
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set move ra 1 func khác để set 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		device.AppVersion = payload.AppVersion
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
		device.IsMobile = true
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	result = device
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
	return
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
			||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
| 
					
 ko public cái này ko public cái này 
			
		ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// Constant ...
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
const (
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	tableDevice = "devices"
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	timezoneHCM = "Asia/Ho_Chi_Minh"
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	langVi = "vi"
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	langEn = "en"
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
| 
					
 bỏ cái này bỏ cái này 
			
		bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
import (
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	"errors"
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	"fmt"
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	"github.com/Selly-Modules/mongodb"
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// MongoDBConfig ...
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
type MongoDBConfig struct {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	Host, User, Password, DBName, mechanism, source string
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// Config ...
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
type Config struct {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	// MongoDB config, for save documents
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	MongoDB MongoDBConfig
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	// Table prefix, each service has its own prefix
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	TablePrefix string
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// Service ...
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
type Service struct {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	Config
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	DB *mongo.Database
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
var s *Service
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// Init ...
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
func Init(config Config) (*Service, error) {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	if config.MongoDB.Host == "" || config.TablePrefix == "" {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		return nil, errors.New("please provide all necessary information for init device")
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	// Connect MongoDB
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	db, err := mongodb.Connect(
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.Host,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.User,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.Password,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.DBName,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.mechanism,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		config.MongoDB.source,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	)
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	if err != nil {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		fmt.Println("Cannot init module DEVICE MANAGEMENT", err)
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		return nil, err
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	s = &Service{
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		Config: config,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
		DB:     db,
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	return s, nil
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
// GetInstance ...
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
func GetInstance() *Service {
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	return s
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 bỏ cái này bỏ cái này 
			
		return thêm Service về nữa 
			
			return thêm Service về nữa
```go
func Init(config Config) (*Service, error) {
  // ...
  return s, nil
}
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -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=
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,50 @@
 | 
			
		|||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		done done 
			
		 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
import (
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	"context"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	"fmt"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	"github.com/Selly-Modules/logger"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	ua "github.com/mssola/user_agent"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/mongo"
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
//  getDeviceCollection ...
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
func (s Service) getDeviceCollection() *mongo.Collection {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	return s.DB.Collection(fmt.Sprintf("%s-%s", s.TablePrefix, tableDevice))
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
func (s Service) isDeviceIDExisted(ctx context.Context, deviceID string) bool {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	var (
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
		col    = s.getDeviceCollection()
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
		device = Device{}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	)
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	if err := col.FindOne(ctx, bson.M{"deviceID": deviceID}).Decode(&device); err != nil {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
		logger.Error("devicemngt - findByDeviceID", logger.LogData{
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
			"deviceID": deviceID,
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
			"err":      err.Error(),
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 chỗ này return luôn chớ? chỗ này return luôn chớ? 
			
		gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		done done  
			
		 | 
			||||
		return true
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	return !device.ID.IsZero()
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
func getOSName(userAgent string) string {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	uaData := ua.New(userAgent)
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	return uaData.OSInfo().Name
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
func getOSVersion(userAgent string) string {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	uaData := ua.New(userAgent)
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	return uaData.OSInfo().Version
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
func getLanguage(lang string) string {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	// Language, default is vietnamese(vi)
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	if lang == langEn {
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
		return langEn
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
	return langVi
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
			||||
| 
						 | 
				
			
			@ -0,0 +1,24 @@
 | 
			
		|||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		done done  
			
		 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
import (
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	"time"
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/bson/primitive"
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
// Device ...
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
type Device struct {
 | 
			
		||||
| 
					
 define thêm  define thêm `json` vào metadata 
			
		done done 
			
		deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	ID              primitive.ObjectID `bson:"_id" json:"_id"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	DeviceID        string             `bson:"deviceID" json:"deviceId"` // unique
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	IP              string             `bson:"ip" json:"ip"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	OSName          string             `bson:"osName" json:"osName"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	OSVersion       string             `bson:"osVersion" json:"osVersion"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	AppVersion      string             `bson:"appVersion" json:"appVersion"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	Language        string             `bson:"language" json:"language"` // vi, en
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	IsMobile        bool               `bson:"isMobile" json:"isMobile"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	LastActivatedAt time.Time          `bson:"lastActivatedAt" json:"lastActivatedAt"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	UserID          primitive.ObjectID `bson:"userID" json:"userId"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	AuthToken       string             `bson:"authToken" json:"authToken"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	FCMToken        string             `bson:"fcmToken" json:"fcmToken"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
	CreatedAt       time.Time          `bson:"createdAt" json:"createdAt"`
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
			||||
| 
						 | 
				
			
			@ -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())
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
DeviceCreate -> CreateOptions
DeviceCreate -> CreateOptions
deviceID already exists -> this device is already existed
deviceID already exists -> this device is already existed
move ra 1 func khác để validate
move ra 1 func khác để validate
move ra 1 func khác để validate
move ra 1 func khác để validate
move ra 1 func khác để validate
move ra 1 func khác để validate
move ra 1 func khác để set, set cứng
device.Language = langVimove ra 1 func khác để set, set cứng
device.Language = langViko cần check userID là mongo id, ko empty là được
ko cần check userID là mongo id, ko empty là được
bỏ cái này
bỏ cái này
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
done
đoạn này + đoạn device id iszero, viết thành 1 func khác
isDeviceIDExistedtrả về booleanđoạn này + đoạn device id iszero, viết thành 1 func khác
isDeviceIDExistedtrả về booleandone
done