niming_backend/blueprints/article.py
2024-11-13 13:20:21 +00:00

120 lines
3.5 KiB
Python

from flask import Blueprint, current_app, request, jsonify
import hashlib
import time
import logger
from sqlalchemy.orm import sessionmaker
from sqlalchemy import desc
import pgclass
"""
TODO:
- Image & Video
- IG post
"""
article = Blueprint('article', __name__)
# 匿名文列表
@article.route('/list', methods = ["GET"])
def listing():
# variables
rst = int(request.args.get("start"))
count = int(request.args.get("count"))
# db
db = current_app.shared_resource.engine
Session = sessionmaker(bind=db)
session = Session()
# get ctx
table = pgclass.SQLarticle
res = session.query(table.id, table.ctx, table.igid, table.created_at, table.mark).order_by(desc(table.id)).filter(table.mark == 'visible').offset(rst).limit(count).all()
# mapping
res = [ {"id":r[0], "ctx":r[1], "igid":r[2], "created_at":r[3], "mark":r[4]} for r in res ]
return jsonify(res)
# 獲取指定文章
@article.route("/get/<int:id>", methods = ["GET"])
def getarticle(id:int):
db = current_app.shared_resource.engine
Session = sessionmaker(bind=db)
session = Session()
# get ctx
table = pgclass.SQLarticle
res = session.query(table.id, table.ctx, table.igid, table.created_at, table.mark).filter(table.id == id).filter(table.mark == 'visible').all()
# mapping
res = [ {"id":r[0], "ctx":r[1], "igid":r[2], "created_at":r[3], "mark":r[4]} for r in res ]
return jsonify(res)
# 上傳文章
@article.route("/post", methods = ["POST"])
def posting():
db = current_app.shared_resource.engine
Session = sessionmaker(bind=db)
session = Session()
# content
ctx = str(request.json["ctx"])
if ctx is None: return "no content"
# hash
seed = ctx + str(time.time())
hash = hashlib.sha256(seed.encode()).hexdigest()
# file processing
# ig posting
igid = None
# mark
mark = "visible"
# posting
table = pgclass.SQLarticle
data = table(hash = hash, ctx = ctx, igid = igid, mark = mark)
session.add(data)
# commit
session.commit()
# pg getdata
res = session.query(table.id, table.ctx, table.igid, table.created_at, table.mark, table.hash).filter(table.hash == hash).all()
res = [ {"id":r[0], "ctx":r[1], "igid":r[2], "created_at":r[3], "mark":r[4], "hash":r[5]} for r in res ]
session.close()
# logger
logger.logger(db, "newpost", "Insert (id=%d): posts"%(res[0]["id"]))
return jsonify(res)
# 只有發文者可以看到的獲取指定文章
# 只有發文者可以做到的刪除文章
@article.route("/own/<sha256>", methods = ["GET", "DELETE"])
def owner_getarticle(sha256:str):
db = current_app.shared_resource.engine
Session = sessionmaker(bind=db)
session = Session()
table = pgclass.SQLarticle
# 獲取指定文章
if request.method == "GET":
res = session.query(table.id, table.ctx, table.igid, table.created_at, table.mark, table.hash).filter(table.hash == sha256).all()
res = [ {"id":r[0], "ctx":r[1], "igid":r[2], "created_at":r[3], "mark":r[4], "hash":r[5]} for r in res ]
return jsonify(res)
# 刪除指定文章
elif request.method == "DELETE":
# delete
res = session.query(table).filter(table.hash == sha256).first()
session.delete(res)
# commit
session.commit()
# logger
logger.logger(db, "delpost", "Delete (id=%d): posts"%(res.id))
return "OK", 200
session.close()