aboutsummaryrefslogtreecommitdiffstats
path: root/database.py
diff options
context:
space:
mode:
Diffstat (limited to 'database.py')
-rw-r--r--database.py70
1 files changed, 63 insertions, 7 deletions
diff --git a/database.py b/database.py
index f5eea45..89f769f 100644
--- a/database.py
+++ b/database.py
@@ -6,6 +6,8 @@ import sqlalchemy as db
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker
+BLOCKSIZE = 1024 ** 2
+
class Types(object):
class ObjectId(db.TypeDecorator):
impl = db.UnicodeText
@@ -25,7 +27,7 @@ class Types(object):
return ";".join(i.replace(";", ",") for i in value)
def process_result_value(self, value : str, dialect) -> list:
- return value.split(";")
+ return value.split(";") if value else []
Base = declarative_base()
@@ -35,6 +37,13 @@ class User(Base):
name = db.Column(db.UnicodeText, nullable=False)
email = db.Column(db.UnicodeText)
hash = db.Column(db.String(512), nullable=False)
+
+ def json(self):
+ return {
+ "id" : self.id,
+ "name" : self.name,
+ "email" : self.email
+ }
class Upload(Base):
__tablename__ = "uploads"
@@ -46,10 +55,23 @@ class Upload(Base):
tags = db.Column(Types.List, default=list)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)
+ readonly = db.Column(db.Boolean, nullable=True, default=bool)
_v = db.Column(db.Integer, default=0)
author = relationship("User")
- #dependency = relationship("Dependency")
+
+ def json(self):
+ return {
+ "id" : self.id,
+ "title" : self.title,
+ "author" : self.author.json() if self.author else {"name" : "N/A"},
+ "description" : self.description,
+ "slug" : self.slug,
+ "tags" : self.tags,
+ "createdAt" : self.created_at.isoformat(),
+ "updatedAt" : self.updated_at.isoformat(),
+ "_v" : self._v
+ }
class File(Base):
__tablename__ = "files"
@@ -63,6 +85,22 @@ class File(Base):
download_url = db.Column(db.Text)
upload = relationship("Upload")
+
+ def json(self):
+ return {
+ "id" : self.id,
+ "filename" : self.name,
+ "metadata" : {
+ "hashes" : {
+ "sha1" : self.hash
+ }
+ },
+ "aliases" : None,
+ "content-type" : self.content_type,
+ "length" : self.length,
+ "chunkSize" : BLOCKSIZE,
+ "uploadDate" : self.date.isoformat()
+ }
class Comment(Base):
__tablename__ = "comments"
@@ -75,16 +113,34 @@ class Comment(Base):
author = relationship("User")
upload = relationship("Upload")
+
+ def json(self):
+ return {
+ "id" : self.id,
+ "body" : self.body,
+ "author" : self.author.json(),
+ "upload" : self.upload.id,
+ "createdAt" : self.created_at.isoformat(),
+ "updatedAt" : self.updated_at.isoformat()
+ }
-class Voting(Base):
- __tablename__ = "votings"
+class Vote(Base):
+ __tablename__ = "votes"
id = db.Column(Types.ObjectId, primary_key=True, default=ObjectId)
author_id = db.Column(Types.ObjectId, db.ForeignKey("users.id"))
- target_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id"))
+ upload_id = db.Column(Types.ObjectId, db.ForeignKey("uploads.id"))
+ impact = db.Column(db.Integer, nullable=False)
author = relationship("User")
- target = relationship("Upload")
- pass
+ upload = relationship("Upload")
+
+ def json(self):
+ return {
+ "id" : self.id,
+ "author" : self.author.json(),
+ "upload" : self.upload.id,
+ "impact" : self.impact
+ }
#class Dependency(Base):
#__tablename__ = "dependencies"