STRAPS_LOCALHOST/DOKUMENTASI_SCRIPTS_FOLDER.md

15 KiB

Dokumentasi Folder scripts/

Gambaran Umum

Folder scripts/ berisi utility scripts untuk development, testing, dan database management. Scripts ini membantu developer untuk verify functionality, seed data, dan debug issues.


📁 Struktur Direktori

scripts/
├── check-links.ts          # Check user-coach relationships
├── check_logs.ts           # View recent activity logs
├── seed_log.ts             # Create test activity log
├── test_har_core.ts        # Test activity recognition system
└── test_rehab_core.ts      # Test exercise recognition system

Total Files: 5 TypeScript scripts


📄 Database Management Scripts

1. check-links.ts 🔗

Path: /scripts/check-links.ts

Fungsi: Menampilkan semua users dan coach-client relationships

Size: ~466 bytes

Use Case:

  • Verify seeding berhasil
  • Debug coach-client assignments
  • Quick database health check

Code:

import "dotenv/config";
import { PrismaClient } from "../app/generated/client/client";

const prisma = new PrismaClient();

async function main() {
	const users = await prisma.users.findMany();
	console.log("--- All Users ---");
	users.forEach((u) =>
		console.log(`${u.name} (${u.role}): ID=${u.id}, CoachID=${u.coach_id}`),
	);
}

How to Run:

npx tsx scripts/check-links.ts

Expected Output:

--- All Users ---
Coach One (COACH): ID=C00001, CoachID=null
Coach Two (COACH): ID=C00002, CoachID=null
Client One (CLIENT): ID=U00001, CoachID=C00001
Client Two (CLIENT): ID=U00002, CoachID=C00001
Client Three (CLIENT): ID=U00003, CoachID=C00002

Use Cases:

  • Verify after running prisma db seed
  • Check migration success
  • Debug role assignments
  • List all registered users

2. check_logs.ts 📋

Path: /scripts/check_logs.ts

Fungsi: Menampilkan 10 activity logs terbaru dari database

Size: ~887 bytes

Use Case:

  • Monitor real-time activity tracking
  • Debug activity logging system
  • Verify fall detection alerts
  • Inspect log details (JSON)

Code:

import { PrismaClient } from "../app/generated/client/client";
import * as dotenv from "dotenv";
dotenv.config();

const prisma = new PrismaClient();

async function main() {
	console.log("Checking Activity Logs...");
	const logs = await prisma.activity_logs.findMany({
		take: 10,
		orderBy: { timestamp: "desc" },
		include: {
			user: { select: { name: true } },
		},
	});

	if (logs.length === 0) {
		console.log("No logs found.");
	} else {
		console.log(`Found ${logs.length} logs:`);
		logs.forEach((log) => {
			console.log(
				`[${log.timestamp?.toISOString()}] ` +
					`User: ${log.user?.name || log.user_id} | ` +
					`Status: ${log.status} | ` +
					`Details: ${JSON.stringify(log.details)}`,
			);
		});
	}
}

How to Run:

npx tsx scripts/check_logs.ts

Expected Output:

Checking Activity Logs...
Found 3 logs:
[2025-12-28T10:30:00.000Z] User: Client One | Status: Standing | Details: {"exercise":"bicep_curl","reps":5}
[2025-12-28T10:25:00.000Z] User: Client Two | Status: Sitting | Details: {}
[2025-12-28T10:20:00.000Z] User: Client One | Status: Standing | Details: {}

Features:

  • Shows latest 10 logs (configurable via take)
  • Ordered by timestamp (newest first)
  • Includes user name via join
  • Pretty-prints JSON details

When to Use:

  • After training session untuk verify logs created
  • Debug fall detection alerts
  • Monitor which users are active

3. seed_log.ts 🌱

Path: /scripts/seed_log.ts

Fungsi: Membuat test activity log untuk development

Size: ~816 bytes

Use Case:

  • Populate database dengan sample logs
  • Test log display UI
  • Verify logging system works

Code:

import { PrismaClient } from "../app/generated/client/client";
import * as dotenv from "dotenv";
dotenv.config();

const prisma = new PrismaClient();

async function main() {
	console.log("Seeding Mock Log...");

	// Get a client user
	const user = await prisma.users.findFirst({
		where: { role: "CLIENT" },
	});

	if (!user) {
		console.error("No client user found to attach log to.");
		return;
	}

	const log = await prisma.activity_logs.create({
		data: {
			user_id: user.id,
			timestamp: new Date(),
			status: "TEST_LOG",
			confidence: "1.0",
			details: { message: "Manual verification log" },
		},
	});

	console.log("Created Log ID:", log.id);
}

How to Run:

npx tsx scripts/seed_log.ts

Expected Output:

Seeding Mock Log...
Created Log ID: 1

Use Cases:

  • Quick test untuk UI development
  • Verify database schema works
  • Populate logs tanpa perlu run full app

Customization:

// Modify untuk create specific log
data: {
  status: 'Fall Detected',  // Test fall alert
  confidence: '0.95',
  details: {
    coordinates: { x: 100, y: 200 },
    severity: 'HIGH'
  }
}

🧪 Testing Scripts

4. test_har_core.ts 🤖

Path: /scripts/test_har_core.ts

Fungsi: Unit test untuk HARCore activity recognition system

Size: ~1 KB

Use Case:

  • Test XGBoost model integration
  • Verify exercise detection logic
  • Debug HAR system issues
  • Ensure setExercise() mapping works

Code:

import { HARCore } from "../lib/pose/HARCore";
import { Landmark } from "../lib/pose/ExerciseRules";

const har = new HARCore();
const mockLandmarks: Landmark[] = Array(33).fill({
	x: 0.5,
	y: 0.5,
	z: 0,
	visibility: 1,
});

console.log("Testing HARCore...");

const inputs = ["Bicep Curl", "Squats", "deadlift", "Unknown Exercise"];

inputs.forEach((input) => {
	har.setExercise(input);
	console.log(`Set to '${input}'. Invoking process...`);

	har
		.process(mockLandmarks)
		.then((res) => {
			console.log(
				`[PASS] '${input}' -> Result:`,
				res ? `Exercise: ${res.exercise}, Status: ${res.status}` : "NULL",
			);
		})
		.catch((e) => {
			console.error(`[FAIL] '${input}' -> Error:`, e);
		});
});

setTimeout(() => console.log("Done."), 2000);

How to Run:

npx tsx scripts/test_har_core.ts

Expected Output:

Testing HARCore...
Set to 'Bicep Curl'. Invoking process...
Set to 'Squats'. Invoking process...
Set to 'deadlift'. Invoking process...
Set to 'Unknown Exercise'. Invoking process...
[PASS] 'Bicep Curl' -> Result: Exercise: bicep_curl, Status: Standing
[PASS] 'Squats' -> Result: Exercise: squat, Status: Standing
[PASS] 'deadlift' -> Result: Exercise: deadlift, Status: Standing
[PASS] 'Unknown Exercise' -> Result: Exercise: null, Status: Standing
Done.

What It Tests:

  • Exercise name normalization (UI names → config keys)
  • Activity classification (Standing/Sitting/Fall)
  • Integration HARCore + RehabCore
  • Null handling untuk unknown exercises

Debug Use:

// Add this untuk see feature extraction
const features = har.extractFeatures(mockLandmarks);
console.log("Extracted Features:", features.length); // Should be 141

5. test_rehab_core.ts 💪

Path: /scripts/test_rehab_core.ts

Fungsi: Unit test untuk RehabCore exercise recognition system

Size: ~1.1 KB

Use Case:

  • Test all 7 exercise configs load correctly
  • Verify FSM initialization
  • Debug rep counting issues
  • Ensure config keys match

Code:

import { RehabCore } from "../lib/pose/RehabCore";
import { Landmark } from "../lib/pose/ExerciseRules";

const core = new RehabCore();
const mockLandmarks: Landmark[] = Array(33).fill({
	x: 0.5,
	y: 0.5,
	z: 0,
	visibility: 1,
});

const exercises = [
	"bicep_curls",
	"hammer_curls",
	"shoulder_press",
	"lateral_raises",
	"squats",
	"deadlifts",
	"lunges",
];

console.log("Testing RehabCore Config Loading...");

exercises.forEach((name) => {
	try {
		const result = core.process(name, mockLandmarks);

		if (result) {
			console.log(`[PASS] ${name} -> Processed successfully.`);
		} else {
			console.error(`[FAIL] ${name} -> Returned null (Config not found?).`);
		}
	} catch (e) {
		console.error(`[FAIL] ${name} -> Exception:`, e);
	}
});

How to Run:

npx tsx scripts/test_rehab_core.ts

Expected Output:

Testing RehabCore Config Loading...
[PASS] bicep_curls -> Processed successfully.
[PASS] hammer_curls -> Processed successfully.
[PASS] shoulder_press -> Processed successfully.
[PASS] lateral_raises -> Processed successfully.
[PASS] squats -> Processed successfully.
[PASS] deadlifts -> Processed successfully.
[PASS] lunges -> Processed successfully.

What It Tests:

  • Exercise name normalization
  • Config lookup dari EXERCISE_CONFIGS
  • FSM initialization (COUNTER_MAP)
  • Process loop doesn't crash

Common Failures:

[FAIL] bicep_curls -> Returned null (Config not found?)

Cause: Typo in exercise name or config key

Fix: Check ExerciseRules.ts dan RehabCore.ts COUNTER_MAP


🔧 How to Run Scripts

Prerequisites:

# Install tsx (TypeScript executor)
npm install -g tsx

# Or use npx (no global install)
npx tsx scripts/[script-name].ts

Environment Setup:

All scripts load .env file:

# .env
DATABASE_URL="postgresql://user:password@localhost:5432/dbname"

Package Scripts (Optional):

Add to package.json:

{
	"scripts": {
		"check:links": "tsx scripts/check-links.ts",
		"check:logs": "tsx scripts/check_logs.ts",
		"seed:log": "tsx scripts/seed_log.ts",
		"test:har": "tsx scripts/test_har_core.ts",
		"test:rehab": "tsx scripts/test_rehab_core.ts"
	}
}

Then run:

npm run check:links
npm run test:har

📊 Script Usage Matrix

Script Purpose When to Use Dependencies
check-links.ts List users & relationships After seeding, debug assignments Prisma, DB
check_logs.ts View recent activity logs After training sessions Prisma, DB
seed_log.ts Create test log UI development, testing Prisma, DB
test_har_core.ts Test activity recognition After HAR changes, debug HARCore, XGBoost model
test_rehab_core.ts Test exercise recognition After config changes, debug RehabCore, EXERCISE_CONFIGS

🎯 Common Workflows

Workflow 1: Fresh Database Setup

# 1. Reset database
npx prisma migrate reset

# 2. Verify users created
npx tsx scripts/check-links.ts

# 3. Create test log
npx tsx scripts/seed_log.ts

# 4. Verify log saved
npx tsx scripts/check_logs.ts

Workflow 2: Debug Exercise Recognition

# 1. Test all exercises load
npx tsx scripts/test_rehab_core.ts

# 2. If FAIL, check config
cat lib/pose/ExerciseRules.ts | grep -A 5 "bicep_curl"

# 3. Fix and re-test
npx tsx scripts/test_rehab_core.ts

Workflow 3: Monitor Production Logs

# SSH to server
ssh user@production-server

# Check recent activity
cd /path/to/app
npx tsx scripts/check_logs.ts

# If fall detected, investigate
npx tsx scripts/check_logs.ts | grep "Fall Detected"

💡 Extending Scripts

Add New Test Script:

Example: test_form_scoring.ts

import { RehabCore } from "../lib/pose/RehabCore";
import { Landmark } from "../lib/pose/ExerciseRules";

const core = new RehabCore();

// Create realistic landmarks (proper squat form)
const goodSquatLandmarks: Landmark[] = [
	// ... 33 landmarks with correct squat angles
];

const result = core.process("squat", goodSquatLandmarks);
console.log("Form Score:", result?.scores?.deviation_mae);
// Expected: < 8 (Excellent)

Add Data Export Script:

Example: export_recaps.ts

import { PrismaClient } from "../app/generated/client/client";
import fs from "fs";

const prisma = new PrismaClient();

async function main() {
	const recaps = await prisma.user_recaps.findMany({
		include: { user: true, training_menus: true },
	});

	const csv = recaps.map((r) => ({
		user: r.user?.name,
		menu: r.training_menus?.name,
		date: r.completed_at,
		// ... more fields
	}));

	fs.writeFileSync("export.json", JSON.stringify(csv, null, 2));
	console.log("Exported to export.json");
}

main();

🔒 Security Notes

Safe Scripts:

  • check-links.ts - Read-only
  • check_logs.ts - Read-only
  • test_har_core.ts - No DB access
  • test_rehab_core.ts - No DB access

Destructive Scripts: ⚠️

  • seed_log.ts - Writes to database
    • Safe in dev, but be careful in production
    • Consider adding --dry-run flag

Best Practice:

// Add environment check
if (process.env.NODE_ENV === "production") {
	console.error("This script is not safe to run in production!");
	process.exit(1);
}

🚀 Advanced Usage

1. Continuous Testing:

# Watch mode for TDD
npx tsx watch scripts/test_rehab_core.ts

# Re-runs on file change

2. Automated Checks:

# Add to CI/CD pipeline
# .github/workflows/test.yml

- name: Run Unit Tests
  run: |
    npx tsx scripts/test_har_core.ts
    npx tsx scripts/test_rehab_core.ts

3. Data Migration:

// scripts/migrate_old_logs.ts
const oldLogs = await prisma.legacy_logs.findMany();

for (const log of oldLogs) {
	await prisma.activity_logs.create({
		data: {
			user_id: log.userId,
			status: transformStatus(log.oldStatus),
			// ... transform logic
		},
	});
}

🛠️ Troubleshooting

Issue: Cannot find module 'dotenv'

Error: Cannot find module 'dotenv'

Solution:

npm install dotenv

Issue: tsx: command not found

bash: tsx: command not found

Solution:

# Use npx instead
npx tsx scripts/check-links.ts

# Or install globally
npm install -g tsx

Issue: Prisma connection error

Error: Can't reach database server

Solution:

  1. Check PostgreSQL running
  2. Verify DATABASE_URL in .env
  3. Test connection:
    npx prisma db pull
    

Issue: Scripts hang (promises not resolving)

// Add timeout
setTimeout(() => process.exit(0), 5000);

📚 References

Tools Used:

Related Docs:

  • /lib/pose/ - Core AI modules
  • /prisma/ - Database schema
  • package.json - NPM scripts

Summary

Total Scripts: 5

Categories:

  • 🗄️ Database: 3 scripts (check-links, check_logs, seed_log)
  • 🧪 Testing: 2 scripts (test_har_core, test_rehab_core)

When to Use:

  • After database migrations
  • After modifying exercise configs
  • Debugging recognition issues
  • Verifying production data

Quick Commands:

# Database health check
npx tsx scripts/check-links.ts

# View recent activity
npx tsx scripts/check_logs.ts

# Test AI systems
npx tsx scripts/test_har_core.ts
npx tsx scripts/test_rehab_core.ts

Scripts ini adalah development tools penting untuk maintain code quality dan debug issues! 🛠️