Skip to content
Snippets Groups Projects

Draft: initial user flow for creating a wallet

Merged Janssen, D.D. (Dylan, Student M-CS) requested to merge 2-implement_all_user_flows into main
1 file
+ 0
10
Compare changes
  • Side-by-side
  • Inline
database.py 0 → 100644
+ 116
0
import json
import random
import string
from peewee import MySQLDatabase, Model, CharField, BlobField, AutoField, IntegrityError, DoesNotExist, BigIntegerField
from peewee import IntegerField, ForeignKeyField, DoubleField
import os
db = MySQLDatabase(None)
def get_db_uri():
user = os.getenv("DB_USER")
password = os.getenv("DB_PASSWORD")
host = os.getenv("DB_HOST")
port = os.getenv("DB_PORT")
database = os.getenv("DB_DATABASE")
return "mysql://{}:{}@{}:{}/{}".format(
user,
password,
host,
port,
database
)
def connect(create_tables=False) -> None:
"""Initializes the database session and connects to the database
:param create_tables: Creates database tables [default: False]
"""
user = os.getenv("DB_USER")
pw = os.getenv("DB_PASSWORD")
host = os.getenv("DB_HOST")
port = os.getenv("DB_PORT")
name = os.getenv("DB_DATABASE")
db.init(name, host=host, port=int(port), user=user, password=pw)
db.connect()
if create_tables:
db.create_tables([AppState, AppUser, AppWallet,
AppWalletRequest, AppUserWallet, AppPendingTX])
class BaseModel(Model):
id = AutoField()
class Meta:
database = db
class AppState(BaseModel):
message = CharField()
menu = CharField(null=True)
prev_state = IntegerField()
next_state = IntegerField()
class AppUser(BaseModel):
telegram_id = BigIntegerField(unique=True)
state_id = ForeignKeyField(AppState, default=1)
nickname = CharField()
variables = CharField(default="{}")
def next_state(self):
AppUser.update({AppUser.state_id: self.state_id.next_state}).where(AppUser.id == self.id).execute()
return self.state_id.next_state
def set_state(self, new_state):
AppUser.update({AppUser.state_id: new_state}).where(AppUser.id == self.id).execute()
@property
def all_variables(self):
newuser = AppUser.get(AppUser.id == self.id)
return json.loads(str(newuser.variables))
def set_variables(self, new_variables: dict):
AppUser.update({AppUser.variables: json.dumps(new_variables)}).where(AppUser.id == self.id).execute()
def set_variable(self, key, value):
new_variables = self.all_variables
new_variables[key] = value
self.set_variables(new_variables)
class AppWallet(BaseModel):
max_co_signers = IntegerField()
min_co_signers = IntegerField()
initiator_user_id = ForeignKeyField(AppUser, backref='users')
name = CharField()
class AppWalletRequest(BaseModel):
token = CharField()
wallet_id = ForeignKeyField(AppWallet, backref='walletrequests')
@classmethod
def generate_requests(cls, amount, wallet_id):
wallet_requests = [{'token': ''.join(random.choice(string.ascii_letters) for i in range(64)), 'wallet_id': wallet_id} for x in range(amount)]
AppWalletRequest.insert(wallet_requests).execute()
return wallet_requests
class AppUserWallet(BaseModel):
user_id = ForeignKeyField(AppUser, backref='wallets')
wallet_id = ForeignKeyField(AppWallet, backref='wallets')
class AppPendingTX(BaseModel):
from_wallet_id = ForeignKeyField(AppWallet, backref='pendingtx')
to_address = CharField()
amount = DoubleField()
fee_sat_per_byte = IntegerField()
status = IntegerField()
sign_count = IntegerField()
raw_data = BlobField()
txid = BlobField()
Loading