# Login Auth Services

![npm](https://img.shields.io/npm/v/login-auth-services) ![license](https://img.shields.io/npm/l/login-auth-services)

**Login Auth Services** is a robust authentication package supporting multiple OAuth providers (Google, GitHub, Microsoft, and Okta) with multi-factor authentication (OTP). It also includes a **sync-db** command to synchronize your database schema using **TypeORM**.

## 🚀 Features

- 🔒 **OAuth Authentication** for:
  - Google
  - GitHub
  - Microsoft
  - Okta
- 🔑 **Multi-Factor Authentication (MFA)** using One-Time Password (OTP)
- 🛠 **Database Agnostic** - Works with **any** database supported by TypeORM
- 🔄 **Database Synchronization** via `sync-db` command
- 🔐 **JWT-based Authentication**
- 📧 **Email verification & password reset** using Nodemailer
- 📦 **Easily Integrates with Express.js**

---

## 📦 Installation

Install via npm:

```sh
npm install login-auth-services
```

or using yarn:

```sh
yarn add login-auth-services
```

---

## 📌 TypeORM & Database Setup

This package uses **TypeORM** for database interactions. You can use **any** relational database (MySQL, PostgreSQL, SQLite, etc.).

### 1️⃣ Configure `database.config.ts`

Create a `database.config.ts` file to configure TypeORM's **DataSource**:

```ts
import { DataSource } from "typeorm";
import dotenv from "dotenv";

dotenv.config();

export const AppDataSource = new DataSource({
  type: process.env.DATABASE_TYPE as any,
  host: process.env.DATABASE_HOST,
  port: Number(process.env.DATABASE_PORT),
  username: process.env.DATABASE_USERNAME,
  password: process.env.DATABASE_PASSWORD,
  database: process.env.DATABASE_NAME,
  synchronize: false, // Use sync-db instead
  logging: false,
  entities: ["src/entity/*.ts"],
});

AppDataSource.initialize()
  .then(() => console.log("Database connected"))
  .catch((err) => console.error("Database connection failed", err));
```

### 2️⃣ Define Entities

Entities define the database structure. Example `User` entity:

```ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  password: string;
}
```

---

## 🔄 Sync Database

This package includes a `sync-db` command to synchronize your database schema with TypeORM entities.

### **Running sync-db**

Run the following command to apply migrations and synchronize the database:

```sh
npx sync-db
```

This will automatically update the database schema based on TypeORM entities. Ensure `synchronize` is **disabled** in `database.config.ts` to avoid conflicts.

---

## 🔑 Authentication Usage

### Google OAuth Login

```ts
import { GoogleAuthService } from "login-auth-services";

const googleAuth = new GoogleAuthService({
  clientId: "your-client-id",
  clientSecret: "your-client-secret",
  redirectUri: "your-redirect-uri",
});

app.get("/auth/google", async (req, res) => {
  const url = googleAuth.getAuthUrl();
  res.redirect(url);
});

app.get("/auth/google/callback", async (req, res) => {
  const token = await googleAuth.getAccessToken(req.query.code);
  res.json(token);
});
```

### GitHub OAuth Login

```ts
import { GitHubAuthService } from "login-auth-services";

const githubAuth = new GitHubAuthService({
  clientId: "your-client-id",
  clientSecret: "your-client-secret",
  redirectUri: "your-redirect-uri",
});

app.get("/auth/github", async (req, res) => {
  const url = githubAuth.getAuthUrl();
  res.redirect(url);
});

app.get("/auth/github/callback", async (req, res) => {
  const token = await githubAuth.getAccessToken(req.query.code);
  res.json(token);
});
```

---

## 📧 Email Verification & Password Reset

### Send Verification Email

```ts
import { sendVerificationEmail } from "login-auth-services";

await sendVerificationEmail(user.email, user.verificationCode);
```

---

## 📌 Custom Login Authentication

### Register User

```ts
import { registerUser } from "login-auth-services";

const user = await registerUser({
  email: "user@example.com",
  password: "securepassword",
});
```

### Login User

```ts
import { loginUser } from "login-auth-services";

const token = await loginUser({
  email: "user@example.com",
  password: "securepassword",
});
```

### Verify OTP for Multi-Factor Authentication

```ts
import { verifyOTP } from "login-auth-services";

const isValid = await verifyOTP({
  email: "user@example.com",
  otp: "123456",
});
```

---

## 📜 License

This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) file for details.

---

## 🙌 Contributions

Contributions, issues, and feature requests are welcome! Feel free to fork, submit PRs, or open issues on GitHub.

---

## 📝 Author

**Harshil Patel**  
📧 Email: [harshilpatel29072003@gmail.com]  


---

This README includes **TypeORM configuration**, **database synchronization with sync-db**, and **entity setup**.

