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()}"