add createMethod #2
			
				
			
		
		
		
	| 
						 | 
					@ -61,16 +61,16 @@ func (s Service) Create(payload CreateOptions) error {
 | 
				
			||||||
| 
						
							
 | 
				|||||||
func (payload CreateOptions) newDevice() (result Device, err error) {
 | 
					func (payload CreateOptions) newDevice() (result Device, err error) {
 | 
				
			||||||
	timeNow := now()
 | 
						timeNow := now()
 | 
				
			||||||
	device := Device{
 | 
						device := Device{
 | 
				
			||||||
		ID:             mongodb.NewObjectID(),
 | 
							ID:              mongodb.NewObjectID(),
 | 
				
			||||||
| 
							
								
									
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
					|||||||
		DeviceID:       payload.DeviceID,
 | 
							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:         getOSName(payload.UserAgent),
 | 
							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  
			
		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),
 | 
							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  
			
		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,
 | 
							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  
			
		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),
 | 
							Language:        getLanguage(payload.Language),
 | 
				
			||||||
| 
							
								
									
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
					|||||||
		AuthToken:      payload.AuthToken,
 | 
							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  
			
		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,
 | 
							LastActivatedAt: timeNow,
 | 
				
			||||||
| 
							
								
									
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
					|||||||
		CreatedAt:      timeNow,
 | 
							CreatedAt:       timeNow,
 | 
				
			||||||
| 
							
								
									
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
					|||||||
		FCMToken:       payload.FCMToken,
 | 
							FCMToken:        payload.FCMToken,
 | 
				
			||||||
| 
							
								
									
 DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		DeviceCreate -> CreateOptions DeviceCreate -> CreateOptions 
			
		deviceID already exists -> this device is already existed deviceID already exists -> this device is already existed 
			
		
			
			```go
return fmt.Errorf("error when create device: %s", err.Error())
``` 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để validate move ra 1 func khác để validate 
			
		move ra 1 func khác để set, set cứng  move ra 1 func khác để set, set cứng `device.Language = langVi` 
			
		ko cần check userID là mongo id, ko empty là được ko cần check userID là mongo id, ko empty là được 
			
		bỏ cái này bỏ cái này 
			
		done done 
			
		done done  
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		done done 
			
		đoạn này + đoạn device id iszero, viết thành 1 func khác  đoạn này + đoạn device id iszero, viết thành 1 func khác `isDeviceIDExisted` trả về boolean 
			
		done done  
			
		 | 
					|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// App version
 | 
						// App version
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						
							
 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  
			
		 | 
				|||||||
| 
						 | 
					@ -26,12 +26,9 @@ func (s Service) isDeviceIDExisted(ctx context.Context, deviceID string) bool {
 | 
				
			||||||
| 
						
							
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		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 
			
		 | 
				|||||||
			"deviceID": deviceID,
 | 
								"deviceID": deviceID,
 | 
				
			||||||
			"err":      err.Error(),
 | 
								"err":      err.Error(),
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
| 
						
							
 chỗ này return luôn chớ? chỗ này return luôn chớ? 
			
		done done  
			
		 | 
				|||||||
	}
 | 
					 | 
				
			||||||
| 
						
							
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
				|||||||
	if !device.ID.IsZero() {
 | 
					 | 
				
			||||||
| 
						
							
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
				|||||||
		return true
 | 
							return true
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						return !device.ID.IsZero()
 | 
				
			||||||
| 
							
								
									
 gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		gom code khúc này thành  func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false gom code khúc này thành `return !device.ID.IsZero()`
func này check device có tồn tại ko, nên nếu tồn tại trả true, ko tồn tại trả false 
			
		done done 
			
		 | 
					|||||||
	return 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 
			
		 | 
				|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func getOSName(userAgent string) string {
 | 
					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 
			
		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 ...
 | 
					// Device ...
 | 
				
			||||||
type Device struct {
 | 
					type Device struct {
 | 
				
			||||||
| 
						
							
 define thêm  define thêm `json` vào metadata 
			
		done done 
			
		 | 
				|||||||
	ID             primitive.ObjectID `bson:"_id" json:"_id"`
 | 
						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, 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        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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						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  
			
		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
 | 
						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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						LastActivatedAt time.Time          `bson:"lastActivatedAt" json:"lastActivatedAt"`
 | 
				
			||||||
| 
							
								
									
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		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"`
 | 
						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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						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  
			
		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"`
 | 
						CreatedAt       time.Time          `bson:"createdAt" json:"createdAt"`
 | 
				
			||||||
| 
							
								
									
 deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		deviceId, json dùng camel case, sửa luôn các id khác deviceId, json dùng camel case, sửa luôn các id khác 
			
		done done 
			
		LastActivatedAt LastActivatedAt 
			
		done done  
			
		 | 
					|||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						
							
 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  
			
		 | 
				|||||||
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