50 lines
1.7 KiB
Python
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()}"
|