Fix login redirect behavior
This commit is contained in:
36
README.md
36
README.md
@ -33,17 +33,53 @@ Target deploy:
|
|||||||
- reverse proxy `nginx`
|
- reverse proxy `nginx`
|
||||||
|
|
||||||
Contoh langkah di server:
|
Contoh langkah di server:
|
||||||
|
|
||||||
|
1. Buat user deploy khusus:
|
||||||
|
```bash
|
||||||
|
sudo adduser deploywa
|
||||||
|
sudo usermod -aG sudo deploywa
|
||||||
|
sudo mkdir -p /var/www
|
||||||
|
sudo chown -R deploywa:deploywa /var/www
|
||||||
|
su - deploywa
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Clone project:
|
||||||
```bash
|
```bash
|
||||||
cd /var/www
|
cd /var/www
|
||||||
git clone https://git.iptek.co/wirabasalamah/webhook-test.git wa-test-nextjs
|
git clone https://git.iptek.co/wirabasalamah/webhook-test.git wa-test-nextjs
|
||||||
cd wa-test-nextjs
|
cd wa-test-nextjs
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Siapkan environment:
|
||||||
|
```bash
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Install dependency dan build:
|
||||||
|
```bash
|
||||||
npm ci
|
npm ci
|
||||||
npm run build
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Jalankan dengan PM2:
|
||||||
|
```bash
|
||||||
npx pm2 start ecosystem.config.cjs
|
npx pm2 start ecosystem.config.cjs
|
||||||
npx pm2 save
|
npx pm2 save
|
||||||
```
|
```
|
||||||
|
|
||||||
|
6. Pasang config nginx:
|
||||||
|
```bash
|
||||||
|
sudo cp deploy/nginx/wa.iptek.co.conf /etc/nginx/sites-available/wa.iptek.co.conf
|
||||||
|
sudo ln -s /etc/nginx/sites-available/wa.iptek.co.conf /etc/nginx/sites-enabled/wa.iptek.co.conf
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
7. Jika pakai HTTPS:
|
||||||
|
```bash
|
||||||
|
sudo certbot --nginx -d wa.iptek.co
|
||||||
|
```
|
||||||
|
|
||||||
Set `.env` minimal:
|
Set `.env` minimal:
|
||||||
```bash
|
```bash
|
||||||
NEXT_PUBLIC_APP_URL=https://wa.iptek.co
|
NEXT_PUBLIC_APP_URL=https://wa.iptek.co
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { NextResponse } from 'next/server'
|
import { NextResponse } from 'next/server'
|
||||||
import { createSession } from '@/lib/auth'
|
import { createSession } from '@/lib/auth'
|
||||||
|
import { buildRedirectUrl } from '@/lib/url'
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
const formData = await request.formData()
|
const formData = await request.formData()
|
||||||
@ -11,8 +12,8 @@ export async function POST(request: Request) {
|
|||||||
password === (process.env.WA_TEST_LOGIN_PASSWORD || 'admin123')
|
password === (process.env.WA_TEST_LOGIN_PASSWORD || 'admin123')
|
||||||
) {
|
) {
|
||||||
await createSession()
|
await createSession()
|
||||||
return NextResponse.redirect(new URL('/settings', request.url))
|
return NextResponse.redirect(buildRedirectUrl(request, '/login'))
|
||||||
}
|
}
|
||||||
|
|
||||||
return NextResponse.redirect(new URL('/login?error=Login%20gagal', request.url))
|
return NextResponse.redirect(buildRedirectUrl(request, '/login?error=Login%20gagal'))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import { NextResponse } from 'next/server'
|
import { NextResponse } from 'next/server'
|
||||||
import { clearSession } from '@/lib/auth'
|
import { clearSession } from '@/lib/auth'
|
||||||
|
import { buildRedirectUrl } from '@/lib/url'
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
await clearSession()
|
await clearSession()
|
||||||
return NextResponse.redirect(new URL('/login', request.url))
|
return NextResponse.redirect(buildRedirectUrl(request, '/login'))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,14 +1,15 @@
|
|||||||
import { NextResponse } from 'next/server'
|
import { NextResponse } from 'next/server'
|
||||||
import { sendTextMessage } from '@/lib/whatsapp'
|
import { sendTextMessage } from '@/lib/whatsapp'
|
||||||
|
import { buildRedirectUrl } from '@/lib/url'
|
||||||
|
|
||||||
export async function POST(request: Request) {
|
export async function POST(request: Request) {
|
||||||
const formData = await request.formData()
|
const formData = await request.formData()
|
||||||
const message = formData.get('message')?.toString() || ''
|
const message = formData.get('message')?.toString() || ''
|
||||||
|
|
||||||
if (!message.trim()) {
|
if (!message.trim()) {
|
||||||
return NextResponse.redirect(new URL('/test?status=Pesan%20kosong', request.url))
|
return NextResponse.redirect(buildRedirectUrl(request, '/test?status=Pesan%20kosong'))
|
||||||
}
|
}
|
||||||
|
|
||||||
await sendTextMessage(process.env.WA_TEST_NUMBER || '', message)
|
await sendTextMessage(process.env.WA_TEST_NUMBER || '', message)
|
||||||
return NextResponse.redirect(new URL('/test?status=Pesan%20berhasil%20dikirim', request.url))
|
return NextResponse.redirect(buildRedirectUrl(request, '/test?status=Pesan%20berhasil%20dikirim'))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,7 @@
|
|||||||
import { redirect } from 'next/navigation'
|
|
||||||
import { isAuthenticated } from '@/lib/auth'
|
import { isAuthenticated } from '@/lib/auth'
|
||||||
|
|
||||||
export default async function LoginPage({ searchParams }: { searchParams: Promise<{ error?: string }> }) {
|
export default async function LoginPage({ searchParams }: { searchParams: Promise<{ error?: string }> }) {
|
||||||
if (await isAuthenticated()) {
|
await isAuthenticated()
|
||||||
redirect('/settings')
|
|
||||||
}
|
|
||||||
|
|
||||||
const params = await searchParams
|
const params = await searchParams
|
||||||
|
|
||||||
|
|||||||
7
src/lib/url.ts
Normal file
7
src/lib/url.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
export function getAppBaseUrl(request: Request) {
|
||||||
|
return process.env.NEXT_PUBLIC_APP_URL || request.url
|
||||||
|
}
|
||||||
|
|
||||||
|
export function buildRedirectUrl(request: Request, path: string) {
|
||||||
|
return new URL(path, getAppBaseUrl(request))
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user