#!/usr/bin/ruby -w require 'sinatra' require 'slim' require 'sqlite3' require 'bcrypt' #1. Skapa ER + databas som kan hålla användare och todos. Fota ER-diagram, # lägg i misc-mapp [x] #2. Skapa ett formulär för att registrerara användare. [x] #3. Skapa ett formulär för att logga in. Om användaren lyckas logga # in: Spara information i session som håller koll på att användaren är inloggad [x] #4. Låt inloggad användare skapa todos i ett formulär (på en ny sida ELLER på sidan som visar todos.). [x] #5. Låt inloggad användare updatera och ta bort sina formulär. [x] #6. Lägg till felhantering (meddelande om man skriver in fel user/lösen) enable :sessions def create_db_handle SQLite3::Database.new("db/todo.db") end get "/" do slim :register end get "/showlogin" do slim :login end get "/todos" do id = session[:id].to_i db = create_db_handle db.results_as_hash = true todos = db.execute "SELECT * FROM Todos WHERE user_id = ?", id slim :"todos/index", locals: {todos: todos} end get "/todos/:tid/edit" do tid = params[:tid].to_i db = create_db_handle db.results_as_hash = true todo = db.execute("SELECT * FROM Todos WHERE id = ?", tid).first begin if( todo["user_id"] == session[:id] ) then slim :"todos/edit", locals: {todo: todo} else "401, access denied!" end rescue => err "500, TODO not found." end end post "/todos/:tid/update" do tid = params[:tid].to_i new_content = params[:content] db = create_db_handle db.execute "UPDATE Todos SET content = ? WHERE id = ?", new_content, tid redirect "/todos" end post "/todos/:tid/delete" do tid = params[:tid].to_i db = create_db_handle db.execute "DELETE FROM Todos WHERE id = ?", tid redirect "/todos" end post "/todos/new" do id = params[:id].to_i content = params[:content] db = create_db_handle db.execute "INSERT INTO Todos (user_id, content) VALUES (?, ?)", id, content redirect "/todos" end post "/users/new" do username = params[:username] password = params[:password] password2 = params[:password_confirm] if( password == password2 ) then pwdigest = BCrypt::Password.create(password) db = create_db_handle db.execute("INSERT INTO Users (username, pwdigest) VALUES (?, ?)", username, pwdigest) redirect "/" else "Passwords does not match..." end end post "/users/login" do username = params[:username] password = params[:password] db = create_db_handle db.results_as_hash = true user_info = db.execute("SELECT * FROM Users WHERE username = ?", username).first dbpass = BCrypt::Password.new(user_info["pwdigest"]) if( dbpass == password ) then session[:id] = user_info["id"] redirect "/todos" else "WRONG PASSWORD!" end end