From 2d42c121419a6419ba47b0f874f393df8587852c Mon Sep 17 00:00:00 2001
From: Pim Beune <git@beune.dev>
Date: Fri, 25 Mar 2022 17:05:28 +0100
Subject: [PATCH] Add peewee ORM

---
 database.py      | 67 ++++++++++++++++++++++++++++++++++++++++++++++++
 requirements.txt |  3 ++-
 2 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100644 database.py

diff --git a/database.py b/database.py
new file mode 100644
index 0000000..9f86a6d
--- /dev/null
+++ b/database.py
@@ -0,0 +1,67 @@
+from peewee import MySQLDatabase, Model, CharField, BlobField, AutoField
+from peewee import IntegerField, ForeignKeyField, DoubleField
+import os
+
+db = MySQLDatabase(None)
+
+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([State, User, Wallet,
+                          WalletRequest, UserWallet, PendingTX])
+
+class BaseModel(Model):
+    id = AutoField()
+    class Meta:
+        database = db
+
+
+class State(BaseModel):
+    message = CharField()
+    menu = CharField()
+    prev_state = IntegerField()
+
+
+class User(BaseModel):
+    telegram_id = IntegerField()
+    state_id = ForeignKeyField(State)
+    nickname = CharField()
+    variables = CharField()
+
+
+class Wallet(BaseModel):
+    max_co_signers = IntegerField()
+    min_co_signers = IntegerField()
+    initiator_user_id = ForeignKeyField(User, backref='users')
+    name = CharField()
+
+
+class WalletRequest(BaseModel):
+    token = CharField()
+    wallet_id = ForeignKeyField(User, backref='walletrequests')
+
+
+class UserWallet(BaseModel):
+    user_id = ForeignKeyField(User, backref='wallets')
+    wallet_id = ForeignKeyField(Wallet, backref='wallets')
+
+
+class PendingTX(BaseModel):
+    from_wallet_id = ForeignKeyField(Wallet, backref='pendingtx')
+    to_address = CharField()
+    amount = DoubleField()
+    fee_sat_per_byte = IntegerField()
+    status = IntegerField()
+    sign_count = IntegerField()
+    raw_data = BlobField()
+    txid = BlobField()
diff --git a/requirements.txt b/requirements.txt
index b4fae21..ebd2f51 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
 python-dotenv~=0.19.2
 bitcoinlib~=0.6.4
 python-telegram-bot~=13.11
-mysqlclient~=2.1.0
\ No newline at end of file
+mysqlclient~=2.1.0
+peewee==3.14.10
-- 
GitLab