The purpose of this document is to outline the high-level requirements for a web-based application modeled after the Dru Sjodin National Sex Offender Public Website (NSOPW), adapted for a Rapist Registry specific to Bangladesh. Unlike the NSOPW, which aggregates official sex offender data from government registries without user submissions, this application will enable public users to submit incident reports or news related to rape cases. These submissions will be subject to administrative approval to ensure accuracy, sensitivity, and compliance with legal standards. The application aims to promote public safety, awareness, and education by providing searchable, verifiable information on reported incidents, including timelines and geographic mapping.
The primary goals are:
- Allow anonymous or registered users to submit detailed incident reports.
- Enable administrators to review, approve, or reject submissions.
- Provide public search functionality for approved incidents, similar to NSOPW's location-based and advanced searches.
- Incorporate educational resources on sexual assault prevention and reporting, akin to NSOPW's safety and education sections.
The application will be a Laravel-based web platform with the following core features:
- User submission form with CAPTCHA (e.g., Cloudflare Turnstile) to prevent spam.
- Admin dashboard for managing submissions.
- Public search interface with filtering by keywords, location, or date.
- Interactive map view using Leaflet.js to display incident locations.
- Detailed incident views with timelines (e.g., incident date, arrest, news publication).
- Integration of reporting hotlines and educational content for victims and the public.
Out of scope:
- Real-time monitoring or law enforcement integration (e.g., no direct API feeds to police databases).
- Mobile app development (focus on responsive web design).
- Advanced analytics or AI-based verification.
- SRS: Software Requirements Specification.
- NSOPW: Dru Sjodin National Sex Offender Public Website.
- Incident: A user-submitted report of a rape-related event, including details like description, location, and timelines.
- Admin: Authorized user with approval privileges.
- CAPTCHA: Completely Automated Public Turing test to tell Computers and Humans Apart (e.g., Cloudflare Turnstile or reCAPTCHA).
- Leaflet.js: Open-source JavaScript library for interactive maps.
- NSOPW Website: https://www.nsopw.gov/ (for inspiration on search interfaces, safety education, and public access to registry data).
- Laravel Framework Documentation: For backend implementation.
- Leaflet.js Documentation: For map integration.
This SRS is organized into sections covering overall description, specific requirements, and supporting information.
This application builds on the NSOPW model by providing a centralized, searchable registry but shifts to a crowd-sourced approach due to the lack of official rapist registries in Bangladesh. It addresses public safety needs by allowing community contributions while maintaining oversight through admin approvals to mitigate misinformation. Similar to NSOPW, it will include educational resources and reporting links, but with added features like geographic mapping and incident timelines for enhanced usability.
- Submission: Users submit incident details via a form; entries are pending until approved.
- Approval Workflow: Admins review, edit, approve, or reject submissions.
- Search and Display: Public users search approved incidents by keywords, location, or filters; results show summaries, details, timelines, and maps.
- Mapping: Display incidents on an interactive map with markers for locations.
- Education and Reporting: Provide static pages with safety tips, hotlines (e.g., Bangladesh national helplines for sexual assault), and resources.
- Public Users: Anonymous or registered; can submit incidents and search/view approved data. Assumed to have basic web literacy.
- Administrators: Registered with elevated privileges; responsible for content moderation. Expected to have domain knowledge in legal/ethical handling of sensitive data.
- Victims/Support Seekers: Users accessing educational resources; no technical expertise required.
- Hardware/Software: Web server (e.g., Apache/Nginx), PHP 8+, MySQL/PostgreSQL database.
- Framework: Laravel (with Blade templates for UI).
- Browser Compatibility: Modern browsers (Chrome, Firefox, Safari) with JavaScript enabled for maps.
- Deployment: Cloud-hosted (e.g., AWS, Heroku) for scalability.
- Use Laravel for backend, Blade for frontend (no Livewire for simplicity).
- Integrate Leaflet.js for maps and Cloudflare Turnstile for form security.
- Adhere to data privacy laws (e.g., Bangladesh's Digital Security Act; anonymize submitter details where possible).
- Ensure responsive design using Bootstrap.
- Assumptions: Users will submit accurate information; admins will handle approvals ethically.
- Dependencies: Availability of geolocation APIs (e.g., for coordinate validation); external libraries like Leaflet.js and Turnstile.
- User Interfaces: Web-based forms, search bars, maps, and dashboards.
- Hardware Interfaces: None.
- Software Interfaces: Integration with mapping libraries; potential email notifications for admins.
- Communication Interfaces: HTTPS for secure data transmission.
- The system shall provide a form for submitting incidents, including fields for: title, description, location (name, coordinates), submitter details (optional), incident date, source URL, and additional timelines (e.g., arrest date, news date).
- Submissions shall include CAPTCHA validation to prevent automated spam.
- Upon submission, entries shall be stored as "pending" and notify admins (e.g., via email or dashboard).
- Admins shall have a dashboard to view pending submissions, with options to approve, reject, or edit (e.g., add notes).
- Approved incidents shall become publicly searchable; rejected ones shall be archived or deleted.
- The system shall support basic searches by keywords (e.g., title, description) and location, similar to NSOPW's location-based queries.
- Advanced filters: By date range, event type (from timelines), or status.
- Results shall display in a paginated list with summaries, linking to detailed views.
- Detailed views shall show full descriptions, timelines (as a chronological list), sources, and maps.
- Timelines shall include event types (e.g., incident, arrest, conviction) with dates and descriptions.
- An interactive map shall display approved incidents as markers, with pop-ups showing basic details.
- Users shall be able to browse incidents via the map (e.g., zoom to Bangladesh regions).
- Static pages shall provide safety education, warning signs of abuse, and response guidelines, adapted from NSOPW.
- Include links to Bangladesh-specific hotlines (e.g., national helpline for women and children: 109).
- Page load times under 3 seconds for searches with up to 100 results.
- Handle up to 1,000 concurrent users.
- Protect sensitive data with encryption (HTTPS).
- Role-based access control (e.g., admins only for approvals).
- Anonymize submitter info in public views.
- 99% uptime; regular backups.
- Intuitive UI with responsive design; mobile phone resolution compatibility
- Modular code structure in Laravel; documented APIs.
- Database optimized for growing submissions; cloud-scalable.
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
// Users table (for admins and optional registered submitters)
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->enum('role', ['admin', 'user'])->default('user');
$table->rememberToken();
$table->timestamps();
});
// Password reset table
Schema::create('password_reset_tokens', function (Blueprint $table) {
$table->string('email')->primary();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
// Sessions table
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
});
// Incidents table
Schema::create('incidents', function (Blueprint $table) {
$table->id();
$table->string('offender_name')->nullable(); // Offender's name
$table->enum('gender', ['male', 'female', 'other', 'unknown'])->nullable(); // Gender
$table->string('ethnicity')->nullable(); // Ethnicity
$table->string('location_name'); // Human-readable location
$table->decimal('latitude', 10, 7)->nullable(); // For map coordinates
$table->decimal('longitude', 10, 7)->nullable(); // For map coordinates
$table->string('height')->nullable(); // Height (e.g., "5'10\"")
$table->string('photo_path')->nullable(); // Path to uploaded photo
$table->string('victim_name')->nullable(); // Victim's name (anonymized if needed)
$table->boolean('arrested')->default(false); // Arrested: Yes/No
$table->text('court_judgement')->nullable(); // Court judgement details
$table->text('offense_detail'); // Detailed description of the offense
$table->text('previous_history')->nullable(); // Previous criminal history
$table->enum('status', ['pending', 'approved', 'rejected'])->default('pending');
$table->foreignId('submitted_by')->nullable()->constrained('users')->onDelete('set null');
$table->string('submitter_name')->nullable();
$table->string('submitter_email')->nullable();
$table->string('submitter_phone')->nullable(); // Added phone number
$table->foreignId('approved_by')->nullable()->constrained('users')->onDelete('set null');
$table->text('admin_notes')->nullable();
$table->timestamps();
});
// Timelines table (for events related to each incident)
Schema::create('timelines', function (Blueprint $table) {
$table->id();
$table->foreignId('incident_id')->constrained()->onDelete('cascade');
$table->enum('event_type', ['incident', 'arrest', 'news_published', 'trial', 'conviction', 'other']);
$table->date('event_date');
$table->text('description')->nullable();
$table->string('source_url')->nullable();
$table->timestamps();
});
// Sources table (for news links)
Schema::create('sources', function (Blueprint $table) {
$table->id();
$table->foreignId('incident_id')->constrained()->onDelete('cascade');
$table->string('news_url'); // URL for news links
$table->text('description')->nullable(); // Optional description of the source
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('sources');
Schema::dropIfExists('timelines');
Schema::dropIfExists('incidents');
Schema::dropIfExists('sessions');
Schema::dropIfExists('password_reset_tokens');
Schema::dropIfExists('users');
}
};