add createMethod #2
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -3,31 +3,38 @@ package devicemngmt
 | 
			
		|||
| 
					
 | 
			||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"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  
			
		 | 
			||||
 | 
			
		||||
	"github.com/Selly-Modules/logger"
 | 
			
		||||
	"github.com/Selly-Modules/mongodb"
 | 
			
		||||
	ua "github.com/mssola/user_agent"
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/bson"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// DeviceCreate ...
 | 
			
		||||
| 
					
 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 DeviceCreate 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  
			
		 | 
			||||
// 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
 | 
			
		||||
	UserID     string
 | 
			
		||||
	UserAgent  string
 | 
			
		||||
	AppVersion string
 | 
			
		||||
	IP         string
 | 
			
		||||
	FCMToken   string
 | 
			
		||||
	AuthToken  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  
			
		 | 
			||||
	Language   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Create ...
 | 
			
		||||
func (s Service) Create(payload DeviceCreate) 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  
			
		 | 
			||||
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 (
 | 
			
		||||
		col = s.getDeviceCollection()
 | 
			
		||||
		ctx = context.Background()
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	deviceData, err := payload.newDevice()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +50,7 @@ func (s Service) Create(payload DeviceCreate) error {
 | 
			
		|||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		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())
``` 
			
		
			
			```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 để 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` 
			
		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 
			
		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 
			
		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 
			
		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 
			
		đ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  
			
		done done  
			
		 | 
			||||
		})
 | 
			
		||||
	}
 | 
			
		||||
	if !device.ID.IsZero() {
 | 
			
		||||
		return errors.New("deviceID already exists")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create device
 | 
			
		||||
| 
						 | 
				
			
			@ -53,78 +60,33 @@ func (s Service) Create(payload DeviceCreate) error {
 | 
			
		|||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		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())
``` 
			
		
			
			```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 để 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` 
			
		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 
			
		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 
			
		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 
			
		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 
			
		đ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  
			
		done done  
			
		 | 
			||||
			"doc": deviceData,
 | 
			
		||||
			"err": err.Error(),
 | 
			
		||||
		})
 | 
			
		||||
		return errors.New("create device fail")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (payload DeviceCreate) 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  
			
		 | 
			||||
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()
 | 
			
		||||
	device := Device{
 | 
			
		||||
		ID:             mongodb.NewObjectID(),
 | 
			
		||||
		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 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  
			
		 | 
			||||
		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  
			
		 | 
			||||
		LastActivityAt: timeNow,
 | 
			
		||||
		CreatedAt:      timeNow,
 | 
			
		||||
		FCMToken:       payload.FCMToken,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Set 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  
			
		 | 
			||||
	if 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  
			
		 | 
			||||
		logger.Error("devicemngt - Create: no deviceID data", 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  
			
		 | 
			||||
			"payload": 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  
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 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 = errors.New("no deviceID data")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	device.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  
			
		 | 
			||||
 | 
			
		||||
| 
					
 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, OSVersion
 | 
			
		||||
| 
					
 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.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  
			
		 | 
			||||
		logger.Error("devicemngt - Create: no userAgent data", 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  
			
		 | 
			||||
			"payload": 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  
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 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 = errors.New("no userAgent data")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	uaData := ua.New(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  
			
		 | 
			||||
	device.OSName = uaData.OSInfo().Name
 | 
			
		||||
| 
					
 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.OSVersion = uaData.OSInfo().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  
			
		 | 
			||||
 | 
			
		||||
| 
					
 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
 | 
			
		||||
	if payload.AppVersion != "" {
 | 
			
		||||
		device.AppVersion = payload.AppVersion
 | 
			
		||||
		device.IsMobile = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 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  
			
		 | 
			||||
	if 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  
			
		 | 
			||||
		logger.Error("devicemngt - Create: no ip data", 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  
			
		 | 
			||||
			"payload": 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  
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 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 = errors.New("no ip data")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
 | 
			
		||||
| 
					
 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, default is vietnamese(vi)
 | 
			
		||||
| 
					
 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.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  
			
		 | 
			||||
		device.Language = viLanguage
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	} else {
 | 
			
		||||
| 
					
 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.Language = enLanguage
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	// userIDe
 | 
			
		||||
| 
					
 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, _ := mongodb.NewIDFromString(payload.UserID)
 | 
			
		||||
| 
					
 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 userID.IsZero() {
 | 
			
		||||
| 
					
 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: invalid userID data", 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  
			
		 | 
			||||
			"payload": 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  
			
		 | 
			||||
		})
 | 
			
		||||
| 
					
 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 = errors.New("invalid userID data")
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	// Generate authToken from userID
 | 
			
		||||
| 
					
 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.AuthToken = s.generateAuthToken(userID)
 | 
			
		||||
| 
					
 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
 | 
			
		||||
	return
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
					
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		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())
``` 
			
		
			
			```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 để 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` 
			
		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 
			
		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 
			
		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 
			
		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 
			
		đ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  
			
		done done  
			
		 | 
			||||
| 
						 | 
				
			
			@ -1,17 +0,0 @@
 | 
			
		|||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		done done 
			
		 | 
			||||
package devicemngmt
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
import (
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	"time"
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	"github.com/dgrijalva/jwt-go"
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	"go.mongodb.org/mongo-driver/bson/primitive"
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
)
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
func (s Service) generateAuthToken(userID primitive.ObjectID) string {
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
		"_id": userID,
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
		"exp": now().Add(time.Second * 15552000).Unix(), // 6 months
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	})
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	tokenString, _ := token.SignedString([]byte(s.AuthSecret))
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
	return tokenString
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
}
 | 
			
		||||
| 
					
 device làm gì có generate token hè? generate token nằm ở bên User Management chớ device làm gì có generate token hè? generate token nằm ở bên User Management chớ 
			
		done done 
			
		 | 
			||||
| 
						 | 
				
			
			@ -2,10 +2,10 @@ package devicemngmt
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
 | 
			
		||||
// Constant ...
 | 
			
		||||
const (
 | 
			
		||||
	TableDevice = "devices"
 | 
			
		||||
| 
					
 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 
			
		 | 
			||||
 | 
			
		||||
	timezoneHCM = "Asia/Ho_Chi_Minh"
 | 
			
		||||
 | 
			
		||||
	viLanguage = "vi"
 | 
			
		||||
| 
					
 ko public cái này ko public cái này 
			
		
			
			```go
langVi = "vi"
langEn = "en"
``` 
			
		done done 
			
		done done 
			
		 | 
			||||
	enLanguage = "en"
 | 
			
		||||
| 
					
 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 
			
		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 
			
		 | 
			||||
| 
						 | 
				
			
			@ -19,8 +19,6 @@ type Config struct {
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
	MongoDB MongoDBConfig
 | 
			
		||||
	// Table prefix, each service has its own prefix
 | 
			
		||||
	TablePrefix string
 | 
			
		||||
	// Auth secret, used to sign token
 | 
			
		||||
| 
					
 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 
			
		 | 
			||||
	AuthSecret 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 
			
		 | 
			||||
}
 | 
			
		||||
 | 
			
		||||
// Service ...
 | 
			
		||||
| 
						 | 
				
			
			@ -32,9 +30,9 @@ type Service struct {
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
var s *Service
 | 
			
		||||
 | 
			
		||||
// Init ...
 | 
			
		||||
func Init(config Config) 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 == "" || config.AuthSecret == "" {
 | 
			
		||||
| 
					
 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 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 
			
		 | 
			||||
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 
			
		 | 
			||||
	}
 | 
			
		||||
 | 
			
		||||
	// Connect MongoDB
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +46,7 @@ func Init(config Config) error {
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		fmt.Println("Cannot init module DEVICE MANAGEMENT", err)
 | 
			
		||||
		return 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 
			
		 | 
			||||
	}
 | 
			
		||||
 | 
			
		||||
	s = &Service{
 | 
			
		||||
| 
						 | 
				
			
			@ -56,7 +54,7 @@ func Init(config Config) error {
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
		DB:     db,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 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 
			
		 | 
			||||
	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 
			
		 | 
			||||
}
 | 
			
		||||
 | 
			
		||||
// GetInstance ...
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
					
 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 
			
		 | 
			||||
							
								
								
									
										21
									
								
								helper.go
								
								
								
								
							
							
						
						| 
						 | 
				
			
			@ -3,10 +3,29 @@ 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 
			
		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 
			
		 | 
			||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	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/mongo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//  getDeviceCollection ...
 | 
			
		||||
func (s Service) getDeviceCollection() *mongo.Collection {
 | 
			
		||||
	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 
			
		 | 
			||||
	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 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
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	}
 | 
			
		||||
| 
					
 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 
			
		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 
			
		 | 
			||||
							
								
								
									
										26
									
								
								model.go
								
								
								
								
							
							
						
						| 
						 | 
				
			
			@ -8,17 +8,17 @@ 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 
			
		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  
			
		 | 
			||||
 | 
			
		||||
// Device ...
 | 
			
		||||
type Device struct {
 | 
			
		||||
| 
					
 define thêm  define thêm `json` vào metadata 
			
		done done 
			
		 | 
			||||
	ID             primitive.ObjectID `bson:"_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"` // 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"` // 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"`
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	LastActivityAt time.Time          `bson:"lastActivityAt"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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"`
 | 
			
		||||
| 
					
 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  
			
		 | 
			||||
	LastActivityAt time.Time          `bson:"lastActivityAt" json:"lastActivityAt"`
 | 
			
		||||
| 
					
 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 
			
		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  
			
		 | 
			||||
| 
						 | 
				
			
			@ -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