From 815701184fa7a931d91477eaf13aed118a39c28d Mon Sep 17 00:00:00 2001 From: ghe0 Date: Thu, 8 May 2025 13:03:21 +0300 Subject: [PATCH] adding payments for VM contracts --- src/db/vm.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/src/db/vm.rs b/src/db/vm.rs index 5641dea..551f533 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(()) } } @@ -370,9 +409,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(()) }