223 lines
7.7 KiB
Python
223 lines
7.7 KiB
Python
import redis
|
|
import json
|
|
import os
|
|
import uuid
|
|
|
|
r = redis.Redis(
|
|
host="185.14.92.202",
|
|
port=12003,
|
|
decode_responses=True,
|
|
username="default",
|
|
password=os.getenv("REDID"),
|
|
db=5,
|
|
)
|
|
|
|
def main(args):
|
|
route = args.get("route", "default")
|
|
body = args.get("body", {})
|
|
try:
|
|
body = json.loads(body) if isinstance(body, str) else body
|
|
except:
|
|
body = {}
|
|
queries = args.get("queries", {})
|
|
|
|
# Serve HTML for default route
|
|
if route == "default":
|
|
try:
|
|
with open("/app/index.html", "r", encoding="utf-8") as f:
|
|
html = f.read()
|
|
return {
|
|
"_shsf": "v2",
|
|
"_code": 200,
|
|
"_headers": {"Content-Type": "text/html"},
|
|
"_res": html
|
|
}
|
|
except Exception as e:
|
|
return {"_shsf": "v2", "_code": 500, "_res": {"error": str(e)}}
|
|
|
|
# Login endpoint
|
|
elif route == "login":
|
|
username = body.get("username", "").strip()
|
|
password = body.get("password", "").strip()
|
|
|
|
if not username or not password:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and password required"}}
|
|
|
|
# Get stored user
|
|
user_key = f"storage1:user:{username}"
|
|
stored_pass = r.get(user_key)
|
|
|
|
if stored_pass == password:
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "username": username}}
|
|
else:
|
|
return {"_shsf": "v2", "_code": 401, "_res": {"error": "Invalid credentials"}}
|
|
|
|
# Register endpoint
|
|
elif route == "register":
|
|
username = body.get("username", "").strip()
|
|
password = body.get("password", "").strip()
|
|
|
|
if not username or not password:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and password required"}}
|
|
|
|
user_key = f"storage1:user:{username}"
|
|
|
|
if r.exists(user_key):
|
|
return {"_shsf": "v2", "_code": 409, "_res": {"error": "Username already exists"}}
|
|
|
|
r.set(user_key, password)
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "username": username}}
|
|
|
|
# Get wishlist items
|
|
elif route == "items":
|
|
username = queries.get("username", "")
|
|
|
|
if not username:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username required"}}
|
|
|
|
items_key = f"storage1:items:{username}"
|
|
items_json = r.get(items_key)
|
|
|
|
if items_json:
|
|
items = json.loads(items_json)
|
|
else:
|
|
items = []
|
|
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"items": items}}
|
|
|
|
# Add wishlist item
|
|
elif route == "add":
|
|
username = body.get("username", "")
|
|
name = body.get("name", "").strip()
|
|
link = body.get("link", "").strip()
|
|
price = body.get("price", "")
|
|
image = body.get("image", "").strip()
|
|
|
|
if not username or not name:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and name required"}}
|
|
|
|
items_key = f"storage1:items:{username}"
|
|
items_json = r.get(items_key)
|
|
|
|
if items_json:
|
|
items = json.loads(items_json)
|
|
else:
|
|
items = []
|
|
|
|
# Generate ID
|
|
item_id = str(len(items) + 1)
|
|
|
|
new_item = {
|
|
"id": item_id,
|
|
"name": name,
|
|
"link": link,
|
|
"price": price,
|
|
"image": image
|
|
}
|
|
|
|
items.append(new_item)
|
|
r.set(items_key, json.dumps(items))
|
|
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"success": True, "item": new_item}}
|
|
|
|
# Update wishlist item
|
|
elif route == "update":
|
|
username = body.get("username", "")
|
|
item_id = body.get("id", "")
|
|
name = body.get("name", "").strip()
|
|
link = body.get("link", "").strip()
|
|
price = body.get("price", "")
|
|
image = body.get("image", "").strip()
|
|
|
|
if not username or not item_id:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and item ID required"}}
|
|
|
|
items_key = f"storage1:items:{username}"
|
|
items_json = r.get(items_key)
|
|
|
|
if not items_json:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}}
|
|
|
|
items = json.loads(items_json)
|
|
|
|
found = False
|
|
for item in items:
|
|
if item["id"] == item_id:
|
|
item["name"] = name
|
|
item["link"] = link
|
|
item["price"] = price
|
|
item["image"] = image
|
|
found = True
|
|
break
|
|
|
|
if not found:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "Item not found"}}
|
|
|
|
r.set(items_key, json.dumps(items))
|
|
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"success": True}}
|
|
|
|
# Delete wishlist item
|
|
elif route == "delete":
|
|
username = body.get("username", "")
|
|
item_id = body.get("id", "")
|
|
|
|
if not username or not item_id:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username and item ID required"}}
|
|
|
|
items_key = f"storage1:items:{username}"
|
|
items_json = r.get(items_key)
|
|
|
|
if not items_json:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}}
|
|
|
|
items = json.loads(items_json)
|
|
items = [item for item in items if item["id"] != item_id]
|
|
|
|
r.set(items_key, json.dumps(items))
|
|
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"success": True}}
|
|
|
|
# Share wishlist (create public copy and return link)
|
|
elif route == "share":
|
|
username = body.get("username", "")
|
|
if not username:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Username required"}}
|
|
items_key = f"storage1:items:{username}"
|
|
items_json = r.get(items_key)
|
|
if not items_json:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "No items found"}}
|
|
# Generate unique share ID
|
|
share_id = str(uuid.uuid4())
|
|
public_key = f"storage1:public:{share_id}"
|
|
r.set(public_key, items_json)
|
|
share_url = f"https://shsf-api.reversed.dev/api/exec/4/57aca15b-665e-4015-b7e3-526a87b39b33/public?share_id={share_id}"
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"share_id": share_id, "share_url": share_url}}
|
|
|
|
# Get public wishlist by share_id
|
|
elif route == "public":
|
|
share_id = queries.get("share_id", "")
|
|
if not share_id:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Share ID required"}}
|
|
public_key = f"storage1:public:{share_id}"
|
|
items_json = r.get(public_key)
|
|
if not items_json:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "Shared wishlist not found"}}
|
|
items = json.loads(items_json)
|
|
return {"_shsf": "v2", "_code": 200, "_res": {"items": items}}
|
|
|
|
# Redirect to UI with share_id for public viewing
|
|
elif route == "redirect_share":
|
|
share_id = queries.get("share_id", "")
|
|
if not share_id:
|
|
return {"_shsf": "v2", "_code": 400, "_res": {"error": "Share ID required"}}
|
|
# Change this URL if your UI is hosted elsewhere
|
|
ui_url = f"https://shsf-api.reversed.dev/api/exec/4/57aca15b-665e-4015-b7e3-526a87b39b33/?share_id={share_id}"
|
|
return {
|
|
"_shsf": "v2",
|
|
"_code": 302,
|
|
"_location": ui_url
|
|
}
|
|
|
|
else:
|
|
return {"_shsf": "v2", "_code": 404, "_res": {"error": "Route not found"}} |