split database into sub-module
This commit is contained in:
parent
be556163c9
commit
8eb60cb0f4
17
relay/database/__init__.py
Normal file
17
relay/database/__init__.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import tinysql
|
||||||
|
|
||||||
|
from .base import DEFAULT_CONFIG, RELAY_SOFTWARE, TABLES
|
||||||
|
from .connection import Connection
|
||||||
|
from .rows import ROWS
|
||||||
|
|
||||||
|
|
||||||
|
class Database(tinysql.Database):
|
||||||
|
def __init__(self, **config):
|
||||||
|
tinysql.Database.__init__(self, **config,
|
||||||
|
connection_class = Connection,
|
||||||
|
row_classes = ROWS
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create(self):
|
||||||
|
self.create_database(TABLES)
|
67
relay/database/base.py
Normal file
67
relay/database/base.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
from tinysql import Column, Table
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
'description': ('str', 'Make a note about your relay here'),
|
||||||
|
'http_timeout': ('int', 10),
|
||||||
|
'json_cache': ('int', 1024),
|
||||||
|
'log_level': ('str', 'INFO'),
|
||||||
|
'name': ('str', 'ActivityRelay'),
|
||||||
|
'privkey': ('str', ''),
|
||||||
|
'push_limit': ('int', 512),
|
||||||
|
'require_approval': ('bool', False),
|
||||||
|
'version': ('int', 20221211),
|
||||||
|
'whitelist': ('bool', False),
|
||||||
|
'workers': ('int', 8)
|
||||||
|
}
|
||||||
|
|
||||||
|
RELAY_SOFTWARE = [
|
||||||
|
'activity-relay', # https://github.com/yukimochi/Activity-Relay
|
||||||
|
'activityrelay', # https://git.pleroma.social/pleroma/relay
|
||||||
|
'aoderelay', # https://git.asonix.dog/asonix/relay
|
||||||
|
'feditools-relay' # https://git.ptzo.gdn/feditools/relay
|
||||||
|
]
|
||||||
|
|
||||||
|
TABLES = [
|
||||||
|
Table('config',
|
||||||
|
Column('key', 'text', unique=True, nullable=False, primary_key=True),
|
||||||
|
Column('value', 'text')
|
||||||
|
),
|
||||||
|
Table('instances',
|
||||||
|
Column('id', 'serial'),
|
||||||
|
Column('domain', 'text', unique=True, nullable=False),
|
||||||
|
Column('actor', 'text'),
|
||||||
|
Column('inbox', 'text', nullable=False),
|
||||||
|
Column('followid', 'text'),
|
||||||
|
Column('software', 'text'),
|
||||||
|
Column('note', 'text'),
|
||||||
|
Column('joined', 'datetime', nullable=False),
|
||||||
|
Column('updated', 'datetime')
|
||||||
|
),
|
||||||
|
Table('whitelist',
|
||||||
|
Column('id', 'serial'),
|
||||||
|
Column('domain', 'text', unique=True),
|
||||||
|
Column('created', 'datetime', nullable=False)
|
||||||
|
),
|
||||||
|
Table('bans',
|
||||||
|
Column('id', 'serial'),
|
||||||
|
Column('name', 'text', unique=True),
|
||||||
|
Column('note', 'text'),
|
||||||
|
Column('type', 'text', nullable=False),
|
||||||
|
Column('created', 'datetime', nullable=False)
|
||||||
|
),
|
||||||
|
Table('users',
|
||||||
|
Column('id', 'serial'),
|
||||||
|
Column('handle', 'text', unique=True, nullable=False),
|
||||||
|
Column('domain', 'text', nullable=False),
|
||||||
|
Column('api_token', 'text'),
|
||||||
|
Column('created', 'datetime', nullable=False),
|
||||||
|
Column('updated', 'datetime')
|
||||||
|
),
|
||||||
|
Table('tokens',
|
||||||
|
Column('id', 'text', unique=True, nullable=False, primary_key=True),
|
||||||
|
Column('userid', 'integer', nullable=False),
|
||||||
|
Column('created', 'datetime', nullable=False),
|
||||||
|
Column('updated', 'datetime')
|
||||||
|
)
|
||||||
|
]
|
|
@ -1,91 +1,10 @@
|
||||||
import tinysql
|
import tinysql
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from tinysql import Column, Table
|
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
from .logger import set_level
|
from .base import DEFAULT_CONFIG
|
||||||
from .misc import AppBase, DotDict, boolean
|
from ..misc import DotDict
|
||||||
|
|
||||||
|
|
||||||
TABLES = [
|
|
||||||
Table('config',
|
|
||||||
Column('key', 'text', unique=True, nullable=False, primary_key=True),
|
|
||||||
Column('value', 'text')
|
|
||||||
),
|
|
||||||
Table('instances',
|
|
||||||
Column('id', 'serial'),
|
|
||||||
Column('domain', 'text', unique=True, nullable=False),
|
|
||||||
Column('actor', 'text'),
|
|
||||||
Column('inbox', 'text', nullable=False),
|
|
||||||
Column('followid', 'text'),
|
|
||||||
Column('software', 'text'),
|
|
||||||
Column('actor_data', 'json'),
|
|
||||||
Column('note', 'text'),
|
|
||||||
Column('joined', 'datetime', nullable=False),
|
|
||||||
Column('updated', 'datetime')
|
|
||||||
),
|
|
||||||
Table('whitelist',
|
|
||||||
Column('id', 'serial'),
|
|
||||||
Column('domain', 'text', unique=True),
|
|
||||||
Column('created', 'datetime', nullable=False)
|
|
||||||
),
|
|
||||||
Table('bans',
|
|
||||||
Column('id', 'serial'),
|
|
||||||
Column('name', 'text', unique=True),
|
|
||||||
Column('note', 'text'),
|
|
||||||
Column('type', 'text', nullable=False),
|
|
||||||
Column('created', 'datetime', nullable=False)
|
|
||||||
),
|
|
||||||
Table('users',
|
|
||||||
Column('id', 'serial'),
|
|
||||||
Column('handle', 'text', unique=True, nullable=False),
|
|
||||||
Column('domain', 'text', nullable=False),
|
|
||||||
Column('api_token', 'text'),
|
|
||||||
Column('created', 'datetime', nullable=False),
|
|
||||||
Column('updated', 'datetime')
|
|
||||||
),
|
|
||||||
Table('tokens',
|
|
||||||
Column('id', 'text', unique=True, nullable=False, primary_key=True),
|
|
||||||
Column('userid', 'integer', nullable=False),
|
|
||||||
Column('created', 'datetime', nullable=False),
|
|
||||||
Column('updated', 'datetime')
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
DEFAULT_CONFIG = {
|
|
||||||
'description': ('str', 'Make a note about your relay here'),
|
|
||||||
'http_timeout': ('int', 10),
|
|
||||||
'json_cache': ('int', 1024),
|
|
||||||
'log_level': ('str', 'INFO'),
|
|
||||||
'name': ('str', 'ActivityRelay'),
|
|
||||||
'privkey': ('str', ''),
|
|
||||||
'push_limit': ('int', 512),
|
|
||||||
'require_approval': ('bool', False),
|
|
||||||
'version': ('int', 20221211),
|
|
||||||
'whitelist': ('bool', False),
|
|
||||||
'workers': ('int', 8)
|
|
||||||
}
|
|
||||||
|
|
||||||
RELAY_SOFTWARE = [
|
|
||||||
'activityrelay', # https://git.pleroma.social/pleroma/relay
|
|
||||||
'aoderelay', # https://git.asonix.dog/asonix/relay
|
|
||||||
'feditools-relay' # https://git.ptzo.gdn/feditools/relay
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
class Database(AppBase, tinysql.Database):
|
|
||||||
def __init__(self, **config):
|
|
||||||
tinysql.Database.__init__(self, **config,
|
|
||||||
connection_class = Connection,
|
|
||||||
row_classes = [
|
|
||||||
ConfigRow
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def create(self):
|
|
||||||
self.create_database(TABLES)
|
|
||||||
|
|
||||||
|
|
||||||
class Connection(tinysql.ConnectionMixin):
|
class Connection(tinysql.ConnectionMixin):
|
||||||
|
@ -163,12 +82,12 @@ class Connection(tinysql.ConnectionMixin):
|
||||||
if not row:
|
if not row:
|
||||||
return DEFAULT_CONFIG[key][1]
|
return DEFAULT_CONFIG[key][1]
|
||||||
|
|
||||||
return row.get_value()
|
return row.value
|
||||||
|
|
||||||
|
|
||||||
def get_config_all(self):
|
def get_config_all(self):
|
||||||
rows = self.select('config').all()
|
rows = self.select('config').all()
|
||||||
config = DotDict({row.key: row.get_value() for row in rows})
|
config = DotDict({row.key: row.value for row in rows})
|
||||||
|
|
||||||
for key, data in DEFAULT_CONFIG.items():
|
for key, data in DEFAULT_CONFIG.items():
|
||||||
if key not in config:
|
if key not in config:
|
||||||
|
@ -247,8 +166,8 @@ class Connection(tinysql.ConnectionMixin):
|
||||||
if value == '__DEFAULT__':
|
if value == '__DEFAULT__':
|
||||||
value = DEFAULT_CONFIG[key][1]
|
value = DEFAULT_CONFIG[key][1]
|
||||||
|
|
||||||
if key == 'log_level':
|
elif key == 'log_level' and not getattr(logging, value.upper(), False):
|
||||||
set_level(value)
|
raise KeyError(value)
|
||||||
|
|
||||||
row = self.select('config', key=key).one()
|
row = self.select('config', key=key).one()
|
||||||
|
|
||||||
|
@ -318,24 +237,3 @@ class Connection(tinysql.ConnectionMixin):
|
||||||
'domain': domain,
|
'domain': domain,
|
||||||
'created': datetime.now()
|
'created': datetime.now()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class ConfigRow(tinysql.Row):
|
|
||||||
__table__ = 'config'
|
|
||||||
|
|
||||||
def get_value(self):
|
|
||||||
type = DEFAULT_CONFIG[self.key][0]
|
|
||||||
|
|
||||||
if type == 'int':
|
|
||||||
return int(self.value)
|
|
||||||
|
|
||||||
elif type == 'bool':
|
|
||||||
return boolean(self.value.encode('utf-8'))
|
|
||||||
|
|
||||||
elif type == 'list':
|
|
||||||
return json.loads(value)
|
|
||||||
|
|
||||||
elif type == 'json':
|
|
||||||
return DotDict.parse(value)
|
|
||||||
|
|
||||||
return self.value
|
|
35
relay/database/rows.py
Normal file
35
relay/database/rows.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import json
|
||||||
|
from tinysql import Row
|
||||||
|
from .base import DEFAULT_CONFIG
|
||||||
|
from ..misc import DotDict, boolean
|
||||||
|
|
||||||
|
|
||||||
|
ROWS = []
|
||||||
|
|
||||||
|
|
||||||
|
def register(cls):
|
||||||
|
ROWS.append(cls)
|
||||||
|
return cls
|
||||||
|
|
||||||
|
|
||||||
|
@register
|
||||||
|
class ConfigRow(Row):
|
||||||
|
__table__ = 'config'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def value(self):
|
||||||
|
type = DEFAULT_CONFIG[self.key][0]
|
||||||
|
|
||||||
|
if type == 'int':
|
||||||
|
return int(self['value'])
|
||||||
|
|
||||||
|
elif type == 'bool':
|
||||||
|
return boolean(self['value'])
|
||||||
|
|
||||||
|
elif type == 'list':
|
||||||
|
return json.loads(self['value'])
|
||||||
|
|
||||||
|
elif type == 'json':
|
||||||
|
return DotDict.parse(self['value'])
|
||||||
|
|
||||||
|
return self['value']
|
Loading…
Reference in a new issue