photolib/photoapp/api.py

104 lines
3.3 KiB
Python

import os
import cherrypy
import logging
import json
from datetime import datetime, timedelta
from photoapp.library import PhotoLibrary
from photoapp.types import Photo, PhotoSet, Tag, TagItem, PhotoStatus, User
from jinja2 import Environment, FileSystemLoader, select_autoescape
from sqlalchemy import desc
from sqlalchemy import func, and_, or_
from photoapp.common import pwhash
import math
from urllib.parse import urlparse
from photoapp.utils import mime2ext, auth, require_auth, photo_auth_filter, slugify
from photoapp.dbutils import db
class PhotosApi(object):
def __init__(self):
self.v1 = PhotosApiV1()
class PhotosApiV1(object):
def __init__(self):
pass
@cherrypy.expose
def index(self):
yield f"<plaintext>hello, this is the api. my database is: {db}\n"
@cherrypy.expose
def upload(self, files, meta):
"""
upload accepts one photoset (multiple images)
metadata format
"""
meta = json.loads(meta)
if type(files) != list:
files = [files]
for file in files:
print("File name:", file.filename)
import hashlib
sha = hashlib.sha256()
total = 0
while True:
b = file.file.read(1024)
if not b:
break
sha.update(b)
total += len(b)
print("Read length:", total)
print("Read sha256:", sha.hexdigest())
if str(file.filename) not in meta["files"].keys():
raise cherrypy.HTTPError(400, f"no mdatadata provided for filename '{file.filename}'")
print("we have metadata for this file:", meta["files"][file.filename])
print("____")
@cherrypy.expose
@cherrypy.tools.json_out()
def byhash(self, sha):
f = db.query(Photo).filter(Photo.hash == sha).first()
if not f:
raise cherrypy.HTTPError(404)
return f.to_json()
@cherrypy.expose
@cherrypy.tools.json_out()
def set(self, uuid):
s = db.query(PhotoSet).filter(PhotoSet.uuid == uuid).first()
if not s:
raise cherrypy.HTTPError(404)
return s.to_json()
@cherrypy.expose
def download(self, uuid):
f = db.query(Photo).filter(Photo.uuid == uuid).first()
if not f:
raise cherrypy.HTTPError(404)
return cherrypy.lib.static.serve_file(os.path.abspath(os.path.join("./library", f.path)),
f.format)#TODO no hardcode path
@cherrypy.expose
@cherrypy.tools.json_out()
def user(self, username=None, password_hash=None):
if username is None: # list all users
return [u.to_json() for u in db.query(User).all()]
elif username and cherrypy.request.method == "DELETE": # delete user
u = db.query(User).filter(User.name == username).first()
if not u:
raise cherrypy.HTTPError(404)
db.delete(u)
elif username and password_hash: # create/update user
u = db.query(User).filter(User.name == username).first()
if u:
u.password = password_hash
else:
db.add(User(name=username, password=password_hash))
return "ok"