# Manual Installation

1. Create `mochi.cr` in initalizers and paste this in:

   ```
    require "mochi"
   ```
2. Create a migration and paste in:

   **Granite:**

   \`\`\`sql\
   \-- +micrate Up CREATE TABLE users ( id INTEGER NOT NULL PRIMARY KEY, email VARCHAR, password\_digest VARCHAR, created\_at TIMESTAMP, updated\_at TIMESTAMP );

````
  -- +micrate Down
  DROP TABLE IF EXISTS users;
```

or

**Jennifer:**

```crystal
class CreateUser < Jennifer::Migration::Base
  def up
    create_table(:users) do |t|
      t.string :email
      t.string :password_digest
      t.timestamp :created_at
      t.timestamp :updated_at
    end
  end

  def down
    drop_table(:users)
  end
end
```
````

1. Migrate:

   **Granite:**

   ```bash
    amber db migrate
   ```

   or

   **Jennifer:**

   ```bash
    crystal sam.cr -- db:migrate
   ```
2. Create a controller titled `user_controller.cr` and paste in this file:

   [user\_controller](/mochi/guides/authenticable/controllers/user_controller.cr.md)
3. Create a controller titled `session_controller.cr` and paste in this file:

   [session\_controller](/mochi/guides/authenticable/controllers/session_controller.cr.md)
4. Add these to your routes:

   Change `pipeline :web` to `pipeline :web, :auth` and add:

   ```
    plug CurrentUser.new
   ```

   Create an `:auth` pipeline with:

   ```
    pipeline :auth do
      plug Authenticate.new
    end
   ```

   Create a new route section just for `:auth`:

   ```
    routes :auth do
      get "/profile", UserController, :show
      get "/profile/edit", UserController, :edit
      patch "/profile", UserController, :update
      get "/signout", SessionController, :delete
    end
   ```

   Add this to your `:web` routes:

   ```
    get "/signin", SessionController, :new
    post "/session", SessionController, :create
    get "/signup", UserController, :new
    post "/registration", UserController, :create
   ```
5. Create a piple titled `authenticate.cr` and paste in this file:

   [authenticate](https://github.com/sundaecr/mochi/tree/2c6c7d74cce829a080515aa79b9b40b8d7d3c859/guides/authenticable/pipes/authenticate.cr)
6. Copy & Paste all the views found here:

   [Views](https://github.com/andrewc910/mochi/tree/master/guides/authenticable/views)
7. Add a model:

   **Granite:**

   [user](/mochi/guides/authenticable/models/granite_user.cr.md)

   or

   **Jennifer:**

   [user](/mochi/guides/authenticable/models/jennifer_user.cr.md){:target="\_blank"}
8. Open `config/application.cr` and between the `# Start Generator` & `# End Generator` add:

   ```
   require "../src/models/**"
   require "../src/pipes/**"
   ```
9. Open `application_controller.cr` and add:

   ```
   def current_user
     context.current_user
   end
   ```
10. Done! And that's why we have a CLI.


---

# 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://awcrotwell.gitbook.io/mochi/guides/authenticable/manual-installation.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.
