diff --git a/src/db/vm.rs b/src/db/vm.rs index 516c517..5ba985e 100644 --- a/src/db/vm.rs +++ b/src/db/vm.rs @@ -191,7 +191,46 @@ impl NewVmReq { } pub async fn submit(self, db: &Surreal) -> Result<(), Error> { - let _: Vec = 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 = db.insert(NEW_VM_REQ).relation(self).await?; + db.query(query).await?; Ok(()) } } @@ -366,9 +405,12 @@ impl ActiveVm { 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 = db.insert(()).relation(active_vm).await?; - NewVmReq::delete(db, id).await?; + db.query(format!("UPDATE {ACCOUNT}:{admin_account} SET tmp_locked -= {locked_nano};")) + .await?; Ok(()) }