uploader-bot/app/core/models/node_storage.py

50 lines
1.7 KiB
Python

from sqlalchemy import Column, BigInteger, Integer, String, ForeignKey, DateTime, JSON, Boolean
from sqlalchemy.orm import relationship
from .base import AlchemyBase
from hashlib import sha256
from base58 import b58encode, b58decode
# DMY CID v1 specs
# 1. int8 cid version
# 2. int256 sha256 of content
# 3. int128 onchain content index
class StoredContent(AlchemyBase):
__tablename__ = 'node_storage'
id = Column(Integer, autoincrement=True, primary_key=True)
hash = Column(String(64), nullable=False, unique=True) # base58
onchain_index = Column(BigInteger, nullable=True, default=None)
filename = Column(String(1024), nullable=False)
meta = Column(JSON, nullable=False, default={})
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
storj_cid = Column(String(1024), nullable=False, unique=True)
ipfs_cid = Column(String(1024), nullable=False, unique=True)
telegram_cid = Column(String(1024), nullable=False, unique=True)
created = Column(DateTime, nullable=False, default=0)
disabled = Column(DateTime, nullable=False, default=0)
disabled_by = Column(Integer, ForeignKey('users.id'), nullable=True, default=None)
key_id = Column(Integer, ForeignKey('known_keys.id'), nullable=True, default=None)
user = relationship('User', uselist=False, foreign_keys=[user_id])
key = relationship('KnownKey', uselist=False, foreign_keys=[key_id])
def make_dmy_cid_v1(self) -> str:
vhash = sha256(
(1).to_bytes(1, 'big') # cid version
+ b58decode(hash)
+ (self.onchain_index or 0).to_bytes(16, 'big')
).digest()
return b58encode(vhash).decode()
def make_deeplink(self):
return f"dmy://storage?cid={self.make_dmy_cid_v1()}"