from "../lib/common.ry" import users, posts, follows, counters, count_items, text_or_empty, number_or_zero, api_error, request_input, username_key, follow_key, counter_key, post_key, find_user, current_user_doc, active_viewer_username, next_sequence, is_username_char, is_valid_username, is_valid_password, is_valid_bio, is_valid_post_body, user_brief_from_doc, public_user_from_doc, serialize_post_doc, insert_post_desc, sort_posts_desc, collect_posts, discover_posts, user_posts, home_feed_posts
fn register(app)
@app.get("/api/me")
fn me()
user = current_user_doc()
if (user == None)
return app.json({"authenticated": False, "csrf_token": session.csrf_token()})
username = text_or_empty(user["username"])
return app.json({
"authenticated": True,
"csrf_token": session.csrf_token(),
"user": public_user_from_doc(user, username)
})
@app.post("/api/auth/signup")
fn signup()
username = text_or_empty(request_input("username"))
password = text_or_empty(request_input("password"))
bio = text_or_empty(request_input("bio"))
if (username == "" || password == "")
return api_error(400, "Username and password are required")
if (is_valid_username(username) == False)
return api_error(400, "Username must be 3-20 chars using lowercase letters, digits, or underscores")
if (is_valid_password(password) == False)
return api_error(400, "Password must be between 6 and 72 characters")
if (is_valid_bio(bio) == False)
return api_error(400, "Bio must be 160 characters or fewer")
if (find_user(username) != None)
return api_error(409, "That username is already taken")
joined_seq = next_sequence("users")
created = users.insert_one({
"_id": username_key(username),
"username": username,
"password_hash": auth_hash_password(password),
"bio": bio,
"joined_seq": joined_seq
})
str(created["inserted_id"])
session.regenerate()
session["username"] = username
return app.json({
"ok": True,
"user": public_user_from_doc(find_user(username), username)
})
@app.post("/api/auth/login")
fn login()
username = text_or_empty(request_input("username"))
password = text_or_empty(request_input("password"))
if (username == "" || password == "")
return api_error(400, "Username and password are required")
user = find_user(username)
if (user == None)
return api_error(401, "Invalid username or password")
if (auth_verify_password(password, text_or_empty(user["password_hash"])) == False)
return api_error(401, "Invalid username or password")
session.regenerate()
session["username"] = username
return app.json({
"ok": True,
"user": public_user_from_doc(user, username)
})
@app.post("/api/auth/logout")
fn logout()
session.destroy()
return app.json({"ok": True})