adding payments for VM contracts
This commit is contained in:
		
							parent
							
								
									af18e4ee77
								
							
						
					
					
						commit
						815701184f
					
				
							
								
								
									
										46
									
								
								src/db/vm.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										46
									
								
								src/db/vm.rs
									
									
									
									
									
								
							| @ -191,7 +191,46 @@ impl NewVmReq { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub async fn submit(self, db: &Surreal<Client>) -> Result<(), Error> { |     pub async fn submit(self, db: &Surreal<Client>) -> Result<(), Error> { | ||||||
|         let _: Vec<Self> = db.insert(NEW_VM_REQ).relation(self).await?; |         let locked_nano = self.locked_nano; | ||||||
|  |         let account = self.admin.key().to_string(); | ||||||
|  |         let vm_id = self.id.key().to_string(); | ||||||
|  |         let vm_node = self.vm_node.key().to_string(); | ||||||
|  |         // TODO: check for possible injection and maybe use .bind()
 | ||||||
|  |         let query = format!( | ||||||
|  |             " | ||||||
|  |             BEGIN TRANSACTION; | ||||||
|  |             UPDATE account:{account} SET balance -= {locked_nano}; | ||||||
|  |             IF account:{account}.balance < 0 {{ | ||||||
|  |                 THROW 'Insufficient funds.' | ||||||
|  |             }}; | ||||||
|  |             UPDATE account:{account} SET tmp_locked += {locked_nano}; | ||||||
|  |             RELATE | ||||||
|  |                 account:{account} | ||||||
|  |                 ->new_vm_req:{vm_id} | ||||||
|  |                 ->vm_node:{vm_node} | ||||||
|  |             CONTENT {{ | ||||||
|  |                 created_at: time::now(), hostname: '{}', vcpus: {}, memory_mb: {}, disk_size_gb: {}, | ||||||
|  |                 extra_ports: {}, public_ipv4: {:?}, public_ipv6: {:?}, | ||||||
|  |                 dtrfs_url: '{}', dtrfs_sha: '{}', kernel_url: '{}', kernel_sha: '{}', | ||||||
|  |                 price_per_unit: {}, locked_nano: {locked_nano}, error: '' | ||||||
|  |             }}; | ||||||
|  |             COMMIT TRANSACTION; | ||||||
|  |         ",
 | ||||||
|  |             self.hostname, | ||||||
|  |             self.vcpus, | ||||||
|  |             self.memory_mb, | ||||||
|  |             self.disk_size_gb, | ||||||
|  |             format!("{:?}", self.extra_ports,), | ||||||
|  |             self.public_ipv4, | ||||||
|  |             self.public_ipv6, | ||||||
|  |             self.dtrfs_url, | ||||||
|  |             self.dtrfs_sha, | ||||||
|  |             self.kernel_url, | ||||||
|  |             self.kernel_sha, | ||||||
|  |             self.price_per_unit | ||||||
|  |         ); | ||||||
|  |         //let _: Vec<Self> = db.insert(NEW_VM_REQ).relation(self).await?;
 | ||||||
|  |         db.query(query).await?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -370,9 +409,12 @@ impl ActiveVm { | |||||||
|             collected_at: new_vm_req.created_at, |             collected_at: new_vm_req.created_at, | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  |         let admin_account = active_vm.admin.key().to_string(); | ||||||
|  |         let locked_nano = active_vm.locked_nano; | ||||||
|         let _: Vec<ActiveVm> = db.insert(()).relation(active_vm).await?; |         let _: Vec<ActiveVm> = db.insert(()).relation(active_vm).await?; | ||||||
| 
 |  | ||||||
|         NewVmReq::delete(db, id).await?; |         NewVmReq::delete(db, id).await?; | ||||||
|  |         db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};")) | ||||||
|  |             .await?; | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user