# Designing our web app

The design phase is the most important in any software project as one small mistake in designing becomes very costly to fix that later. In most projects, there are a few solutions applied to mistakes in design, they are just glued together until it becomes impossible to go forward. The term is called *technical debt*.

Our webapp is going to be a todo list manager for multiple users. It'll have the following features:

```
Ability to add/delete/modify task.
Ability to mark tasks as complete/incomplete.
Display the tasks as a one column list.
Ability to switch modes between pending/completed/deleted tasks.
Display notifications like note added/deleted/archived. 
Search for text and highlight the text in the search results page.
Login/Sign up.
```

## The Design

Translating our design to API, we get the following.

| URL        | Method | Description                    |
| ---------- | ------ | ------------------------------ |
| /add/      | POST   | add new task                   |
| /          | GET    | show pending tasks             |
| /complete/ | GET    | show completed tasks           |
| /deleted/  | GET    | show deleted tasks             |
| /edit/     | POST   | edit post                      |
| /edit/     | GET    | show the edit page             |
| /trash/    | POST   | trash post to recycle bin      |
| /delete/   | POST   | permanently delete post        |
| /complete/ | POST   | mark post as complete          |
| /login/    | POST   | do the login                   |
| /login/    | GET    | show login page                |
| /logout/   | POST   | log the user out               |
| /restore/  | POST   | restore that task              |
| /update/   | POST   | update task                    |
| /change/   | GET    | will allow changing password   |
| /register/ | GET    | show the register page         |
| /register/ | POST   | will add entries into database |

file `~/main/main.go`

```go
package main
import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/complete/", CompleteTaskFunc)
    http.HandleFunc("/delete/", DeleteTaskFunc)
    http.HandleFunc("/deleted/", ShowTrashTaskFunc)
    http.HandleFunc("/trash/", TrashTaskFunc)
    http.HandleFunc("/edit/", EditTaskFunc)
    http.HandleFunc("/completed/", ShowCompleteTasksFunc)
    http.HandleFunc("/restore/", RestoreTaskFunc)
    http.HandleFunc("/add/", AddTaskFunc)
    http.HandleFunc("/update/", UpdateTaskFunc)
    http.HandleFunc("/search/", SearchTaskFunc)
    http.HandleFunc("/login", GetLogin)
    http.HandleFunc("/register", PostRegister)
    http.HandleFunc("/admin", HandleAdmin)
    http.HandleFunc("/add_user", PostAddUser)
    http.HandleFunc("/change", PostChange)
    http.HandleFunc("/logout", HandleLogout)
    http.HandleFunc("/", ShowAllTasksFunc)

    http.Handle("/static/", http.FileServer(http.Dir("public")))
    log.Print("running on port 8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
```

Create all functions we mentioned above and make the necessary changes as per one definition that we show below in this file.

```go
func ShowAllTasksFunc(w http.ResponseWriter, r *http.Request) {
    var message string
    if r.Method == "GET" {
        message = "all pending tasks GET"
    } else {
        message = "all pending tasks POST"
    }
    w.Write([]byte(message))
}
```

After you create these functions run the server as below,

```
[Tasks] $ go build
[Tasks] $ ./Tasks
```

In your browser type `localhost:8080` and type all these URLs and see what message you get.

## Homework

Check the documentation for `http.ResponseWriter` and `http.Request` objects and get to know all the variables/functions/constants for http package and these two which we mentioned.

## Links

-[Previous section](/bo/implementation/2.0implementationbasics.md) -[Next section](/bo/implementation/2.2database.md)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thewhitetulip.gitbook.io/bo/implementation/2.1webappdesign.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
