# Issuing Credentials

**What We Are Doing:**

* Setting up a minimal Express application in `src/index.js` that:
  * Loads environment variables (via `dotenv`).
  * Serves static files from a `public/` directory.
  * Mounts our router (where the `/kyc-credential` route will live).

**Why:** Before we can implement any credential-related endpoints, we need a working Express server that can:

* Host our frontend assets (HTML/CSS/JS) under `public/`.
* Accept POST requests (JSON/form data) from the frontend.
* Delegate route handling to `src/issuer-routes.js`.
* Spin up on a known port so the frontend and wallet callbacks work correctly.

**Steps:** Create `src/index.js` with the following contents:

```javascript
import express from "express";
import path from "path";
import {fileURLToPath} from "url";
import dotenv from "dotenv";
import issuerRouter from "./issuer-routes.js";
import jwt from "jsonwebtoken";

dotenv.config();

// Convert module URL to a __dirname-like value
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

// PORT and BASE_URL come from .env (fallback to 3000 if not set)
const PORT = process.env.PORT || 3000;
const BASE_URL = process.env.BASE_URL || `http://localhost:${PORT}`;

// Initialize Express app
const app = express();

// Serve any static assets (e.g., index.html, scripts, styles) from public/
app.use(express.static(path.join(__dirname, "../public")));

// Parse URL-encoded bodies (HTML form submissions)
app.use(express.urlencoded({extended: true}));

// Attach our router (defined in src/issuer-routes.js)
app.use("/issuer", express.json(), issuerRouter);

// Start the server
app.listen(PORT, () => {
  console.log(`Server is running on ${BASE_URL}`);
});
```

To `.env` file, add the following variables:

```env
PORT=3000

BASE_URL=http://192.168.1.1:3000 # or your desired base URL it should match the URL of your server + the port. 
# It cannot be localhost because the Empe DID Wallet needs to access it from a mobile device

JWT_SECRET=`your-jwt-secret` # a secret key for signing JWTs, used later for authorization
```

Also make sure you have `ISSUER_URL` and `ISSUER_SECRET` set in your `.env` file as described in the [Deploying the Issuer](https://github.com/empe-io/docs/blob/master/tech-doc/getting-started/tutorial/develop-on-empe/tutorial/03-deploying-issuer.md).

***

**Issuing Credentials**

**What We Are Doing:**

* Implementing a route (`/kyc-credential`) in our Express app that:
  * Takes user input (age, firstName, lastName).
  * Contacts the Issuer to create a credential issuance offering.
  * Returns the offering data, including a `qr_code_url`.

**Why:** This route enables users to input their info and receive a QR code. Scanning the QR code with the Empe DID Wallet allows them to claim the credential.

**Steps:** Update `src/issuer-routes.js`:

```javascript
import {Router} from "express";
import fetch from "node-fetch";
import dotenv from "dotenv";

dotenv.config();

const router = Router();
const ISSUER_URL = process.env.ISSUER_URL;
const ISSUER_SECRET = process.env.ISSUER_SECRET;

router.post("/kyc-credential", async (req, res) => {
  try {
    const {age, firstName, lastName} = req.body;
    // Fetch issuer metadata to get offering_endpoint
    const metadataRes = await fetch(`${ISSUER_URL}/.well-known/openid-credential-issuer`);
    const metadata = await metadataRes.json();
    const offering_endpoint = metadata.offering_endpoint;
    // Request an issuance offering from the Issuer
    const offeringRes = await fetch(offering_endpoint, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-client-secret": ISSUER_SECRET,
      },
      body: JSON.stringify({
        credential_type: "KYC Verifiable Credential",
        credential_subject: {age: Number(age), firstName, lastName},
      }),
    });

    const offeringData = await offeringRes.json();
    res.status(200).json(offeringData);
  } catch (error) {
    console.error(error);
    res.status(500).json({error: "Internal server error"});
  }
});

export default router;
```

## Run the server:

```bash
  node src/index.js
```

Next, we will create a simple frontend form to submit user data and display the QR code.


---

# 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://docs.empe.io/getting-started/tutorial/issuing-credentials.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.
