From d16a4b6d262910b555adeb71c9d61fd994f6f528 Mon Sep 17 00:00:00 2001 From: feeling001 Date: Mon, 9 Feb 2026 08:34:47 +0100 Subject: [PATCH] Delete deploy-story2.sh --- deploy-story2.sh | 563 ----------------------------------------------- 1 file changed, 563 deletions(-) delete mode 100755 deploy-story2.sh diff --git a/deploy-story2.sh b/deploy-story2.sh deleted file mode 100755 index 336a8ea..0000000 --- a/deploy-story2.sh +++ /dev/null @@ -1,563 +0,0 @@ -#!/bin/bash - -# ============================================================================= -# LDPv2 - Story 2 Application Management - Deployment Script -# ============================================================================= -# This script deploys the complete implementation of Story 2: -# - Complete frontend components for application management -# - All CRUD operations with filters and search -# - Status management and lifecycle tracking -# ============================================================================= - -set -e # Exit on error - -echo "==========================================" -echo "LDPv2 - Story 2 Deployment" -echo "Application Management - Full Implementation" -echo "==========================================" -echo "" - -# Colors for output -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -RED='\033[0;31m' -NC='\033[0m' # No Color - -# Function to print colored messages -print_success() { - echo -e "${GREEN}✓ $1${NC}" -} - -print_warning() { - echo -e "${YELLOW}⚠ $1${NC}" -} - -print_error() { - echo -e "${RED}✗ $1${NC}" -} - -# Check if we're in the right directory -if [ ! -f "docker-compose.yml" ]; then - print_error "Error: docker-compose.yml not found. Please run this script from the project root." - exit 1 -fi - -echo "Step 1: Backing up existing files..." -BACKUP_DIR="backup_story2_$(date +%Y%m%d_%H%M%S)" -mkdir -p "$BACKUP_DIR" - -# Backup existing application components if they exist -if [ -f "frontend/src/app/features/applications/application-list/application-list.component.ts" ]; then - cp -r frontend/src/app/features/applications "$BACKUP_DIR/" 2>/dev/null || true - print_success "Backed up existing application components to $BACKUP_DIR" -else - print_warning "No existing application components to backup" -fi - -echo "" -echo "Step 2: Deploying frontend components..." - -# ApplicationListComponent -cat > "frontend/src/app/features/applications/application-list/application-list.component.ts" << 'EOF' -import { Component, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Router } from '@angular/router'; -import { FormsModule } from '@angular/forms'; -import { debounceTime, distinctUntilChanged, Subject } from 'rxjs'; -import { ApplicationService } from '../application.service'; -import { BusinessUnitService } from '../../business-units/business-unit.service'; -import { Application, ApplicationStatus } from '../../../shared/models/application.model'; -import { BusinessUnit } from '../../../shared/models/business-unit.model'; -import { Page } from '../../../shared/models/environment.model'; - -@Component({ - selector: 'app-application-list', - standalone: true, - imports: [CommonModule, FormsModule], - templateUrl: './application-list.component.html', - styleUrls: ['./application-list.component.scss'] -}) -export class ApplicationListComponent implements OnInit { - applications: Application[] = []; - businessUnits: BusinessUnit[] = []; - loading = false; - error = ''; - - page = 0; - size = 20; - totalElements = 0; - totalPages = 0; - - searchQuery = ''; - selectedStatus = ''; - selectedBusinessUnitId = ''; - - statusOptions = Object.values(ApplicationStatus); - - private searchSubject = new Subject(); - - constructor( - private applicationService: ApplicationService, - private businessUnitService: BusinessUnitService, - private router: Router - ) { - this.searchSubject.pipe( - debounceTime(300), - distinctUntilChanged() - ).subscribe(() => { - this.page = 0; - this.loadApplications(); - }); - } - - ngOnInit(): void { - this.loadBusinessUnits(); - this.loadApplications(); - } - - loadBusinessUnits(): void { - this.businessUnitService.getBusinessUnits(0, 100).subscribe({ - next: (data: Page) => { - this.businessUnits = data.content; - }, - error: (err) => { - console.error('Failed to load business units', err); - } - }); - } - - loadApplications(): void { - this.loading = true; - const filters: any = {}; - - if (this.selectedStatus) { - filters.status = this.selectedStatus; - } - if (this.selectedBusinessUnitId) { - filters.businessUnitId = this.selectedBusinessUnitId; - } - if (this.searchQuery && this.searchQuery.trim() !== '') { - filters.name = this.searchQuery.trim(); - } - - this.applicationService.getApplications(filters, this.page, this.size).subscribe({ - next: (data: Page) => { - this.applications = data.content; - this.totalElements = data.totalElements; - this.totalPages = data.totalPages; - this.loading = false; - }, - error: (err) => { - this.error = 'Failed to load applications'; - this.loading = false; - } - }); - } - - onSearchChange(query: string): void { - this.searchQuery = query; - this.searchSubject.next(query); - } - - onFilterChange(): void { - this.page = 0; - this.loadApplications(); - } - - createNew(): void { - this.router.navigate(['/applications/new']); - } - - viewDetails(id: string): void { - this.router.navigate(['/applications', id]); - } - - edit(id: string): void { - this.router.navigate(['/applications', id, 'edit']); - } - - changeStatus(id: string, newStatus: string): void { - if (!newStatus || newStatus === 'Change Status') { - return; - } - - this.applicationService.updateStatus(id, newStatus as ApplicationStatus).subscribe({ - next: () => { - this.loadApplications(); - }, - error: (err) => { - this.error = 'Failed to update status'; - } - }); - } - - delete(id: string): void { - if (confirm('Are you sure you want to delete this application?')) { - this.applicationService.deleteApplication(id).subscribe({ - next: () => { - this.loadApplications(); - }, - error: (err) => { - this.error = 'Failed to delete application'; - } - }); - } - } - - nextPage(): void { - if (this.page < this.totalPages - 1) { - this.page++; - this.loadApplications(); - } - } - - previousPage(): void { - if (this.page > 0) { - this.page--; - this.loadApplications(); - } - } - - getStatusDisplay(status: ApplicationStatus): string { - const displays: Record = { - [ApplicationStatus.IDEA]: 'Idea', - [ApplicationStatus.IN_DEVELOPMENT]: 'In Development', - [ApplicationStatus.IN_SERVICE]: 'In Service', - [ApplicationStatus.MAINTENANCE]: 'Maintenance', - [ApplicationStatus.DECOMMISSIONED]: 'Decommissioned' - }; - return displays[status] || status; - } - - getStatusClass(status: ApplicationStatus): string { - const classes: Record = { - [ApplicationStatus.IDEA]: 'status-idea', - [ApplicationStatus.IN_DEVELOPMENT]: 'status-in-development', - [ApplicationStatus.IN_SERVICE]: 'status-in-service', - [ApplicationStatus.MAINTENANCE]: 'status-maintenance', - [ApplicationStatus.DECOMMISSIONED]: 'status-decommissioned' - }; - return classes[status] || ''; - } -} -EOF - -print_success "Created application-list.component.ts" - -# ApplicationDetailComponent -cat > "frontend/src/app/features/applications/application-detail/application-detail.component.ts" << 'EOF' -import { Component, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ApplicationService } from '../application.service'; -import { Application, ApplicationStatus } from '../../../shared/models/application.model'; - -@Component({ - selector: 'app-application-detail', - standalone: true, - imports: [CommonModule], - templateUrl: './application-detail.component.html', - styleUrls: ['./application-detail.component.scss'] -}) -export class ApplicationDetailComponent implements OnInit { - application?: Application; - loading = false; - error = ''; - - constructor( - private applicationService: ApplicationService, - private router: Router, - private route: ActivatedRoute - ) {} - - ngOnInit(): void { - const id = this.route.snapshot.paramMap.get('id'); - if (id) { - this.loadApplication(id); - } - } - - loadApplication(id: string): void { - this.loading = true; - this.applicationService.getApplication(id).subscribe({ - next: (app) => { - this.application = app; - this.loading = false; - }, - error: (err) => { - this.error = 'Failed to load application'; - this.loading = false; - } - }); - } - - edit(): void { - if (this.application) { - this.router.navigate(['/applications', this.application.id, 'edit']); - } - } - - delete(): void { - if (this.application && confirm('Are you sure you want to delete this application?')) { - this.applicationService.deleteApplication(this.application.id).subscribe({ - next: () => { - this.router.navigate(['/applications']); - }, - error: (err) => { - this.error = 'Failed to delete application'; - } - }); - } - } - - back(): void { - this.router.navigate(['/applications']); - } - - getStatusDisplay(status: ApplicationStatus): string { - const displays: Record = { - [ApplicationStatus.IDEA]: 'Idea', - [ApplicationStatus.IN_DEVELOPMENT]: 'In Development', - [ApplicationStatus.IN_SERVICE]: 'In Service', - [ApplicationStatus.MAINTENANCE]: 'Maintenance', - [ApplicationStatus.DECOMMISSIONED]: 'Decommissioned' - }; - return displays[status] || status; - } - - getStatusClass(status: ApplicationStatus): string { - const classes: Record = { - [ApplicationStatus.IDEA]: 'status-idea', - [ApplicationStatus.IN_DEVELOPMENT]: 'status-in-development', - [ApplicationStatus.IN_SERVICE]: 'status-in-service', - [ApplicationStatus.MAINTENANCE]: 'status-maintenance', - [ApplicationStatus.DECOMMISSIONED]: 'status-decommissioned' - }; - return classes[status] || ''; - } -} -EOF - -print_success "Created application-detail.component.ts" - -# ApplicationFormComponent -cat > "frontend/src/app/features/applications/application-form/application-form.component.ts" << 'EOF' -import { Component, OnInit } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ApplicationService } from '../application.service'; -import { BusinessUnitService } from '../../business-units/business-unit.service'; -import { ApplicationStatus } from '../../../shared/models/application.model'; -import { BusinessUnit } from '../../../shared/models/business-unit.model'; -import { Page } from '../../../shared/models/environment.model'; - -@Component({ - selector: 'app-application-form', - standalone: true, - imports: [CommonModule, ReactiveFormsModule], - templateUrl: './application-form.component.html', - styleUrls: ['./application-form.component.scss'] -}) -export class ApplicationFormComponent implements OnInit { - form: FormGroup; - loading = false; - error = ''; - isEditMode = false; - applicationId?: string; - - businessUnits: BusinessUnit[] = []; - statusOptions = Object.values(ApplicationStatus); - - constructor( - private fb: FormBuilder, - private applicationService: ApplicationService, - private businessUnitService: BusinessUnitService, - private router: Router, - private route: ActivatedRoute - ) { - this.form = this.fb.group({ - name: ['', [Validators.required, Validators.maxLength(255)]], - description: [''], - status: [ApplicationStatus.IDEA, [Validators.required]], - businessUnitId: ['', [Validators.required]], - endOfSupportDate: [''], - endOfLifeDate: [''] - }); - } - - ngOnInit(): void { - this.applicationId = this.route.snapshot.paramMap.get('id') || undefined; - this.isEditMode = !!this.applicationId; - - this.loadBusinessUnits(); - - if (this.isEditMode && this.applicationId) { - this.loadApplication(this.applicationId); - } - } - - loadBusinessUnits(): void { - this.businessUnitService.getBusinessUnits(0, 100).subscribe({ - next: (data: Page) => { - this.businessUnits = data.content; - }, - error: (err) => { - this.error = 'Failed to load business units'; - } - }); - } - - loadApplication(id: string): void { - this.loading = true; - this.applicationService.getApplication(id).subscribe({ - next: (app) => { - this.form.patchValue({ - name: app.name, - description: app.description, - status: app.status, - businessUnitId: app.businessUnit.id, - endOfSupportDate: app.endOfSupportDate ? this.formatDateForInput(app.endOfSupportDate) : '', - endOfLifeDate: app.endOfLifeDate ? this.formatDateForInput(app.endOfLifeDate) : '' - }); - this.loading = false; - }, - error: (err) => { - this.error = 'Failed to load application'; - this.loading = false; - } - }); - } - - formatDateForInput(date: Date): string { - const d = new Date(date); - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, '0'); - const day = String(d.getDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; - } - - onSubmit(): void { - if (this.form.valid) { - const endOfSupport = this.form.value.endOfSupportDate; - const endOfLife = this.form.value.endOfLifeDate; - - if (endOfSupport && endOfLife) { - const supportDate = new Date(endOfSupport); - const lifeDate = new Date(endOfLife); - - if (supportDate > lifeDate) { - this.error = 'End of support date must be before end of life date'; - return; - } - } - - this.loading = true; - this.error = ''; - - const formData = { ...this.form.value }; - - if (!formData.endOfSupportDate) { - formData.endOfSupportDate = null; - } - if (!formData.endOfLifeDate) { - formData.endOfLifeDate = null; - } - - const request$ = this.isEditMode && this.applicationId - ? this.applicationService.updateApplication(this.applicationId, formData) - : this.applicationService.createApplication(formData); - - request$.subscribe({ - next: () => { - this.router.navigate(['/applications']); - }, - error: (err) => { - this.error = err.error?.message || 'Failed to save application'; - this.loading = false; - } - }); - } - } - - cancel(): void { - this.router.navigate(['/applications']); - } - - getStatusDisplay(status: ApplicationStatus): string { - const displays: Record = { - [ApplicationStatus.IDEA]: 'Idea', - [ApplicationStatus.IN_DEVELOPMENT]: 'In Development', - [ApplicationStatus.IN_SERVICE]: 'In Service', - [ApplicationStatus.MAINTENANCE]: 'Maintenance', - [ApplicationStatus.DECOMMISSIONED]: 'Decommissioned' - }; - return displays[status] || status; - } -} -EOF - -print_success "Created application-form.component.ts" - -echo "" -echo "Step 3: Verifying backend files..." - -# Check if all backend files exist -BACKEND_FILES=( - "backend/src/main/java/com/ldpv2/domain/enums/ApplicationStatus.java" - "backend/src/main/java/com/ldpv2/domain/entity/Application.java" - "backend/src/main/java/com/ldpv2/repository/ApplicationRepository.java" - "backend/src/main/java/com/ldpv2/service/ApplicationService.java" - "backend/src/main/java/com/ldpv2/controller/ApplicationController.java" - "backend/src/main/java/com/ldpv2/dto/request/CreateApplicationRequest.java" - "backend/src/main/java/com/ldpv2/dto/request/UpdateApplicationRequest.java" - "backend/src/main/java/com/ldpv2/dto/response/ApplicationResponse.java" - "backend/src/main/resources/db/changelog/v1.0/004-create-application-table.xml" -) - -MISSING_FILES=0 -for file in "${BACKEND_FILES[@]}"; do - if [ ! -f "$file" ]; then - print_warning "Missing backend file: $file" - MISSING_FILES=$((MISSING_FILES + 1)) - fi -done - -if [ $MISSING_FILES -eq 0 ]; then - print_success "All backend files present" -else - print_warning "$MISSING_FILES backend files missing (they may already exist from previous work)" -fi - -echo "" -echo "Step 4: Setting permissions..." -chmod +x "$0" -print_success "Script permissions set" - -echo "" -echo "==========================================" -echo "Deployment Summary" -echo "==========================================" -echo "" -print_success "✓ ApplicationListComponent - Complete with filters and search" -print_success "✓ ApplicationDetailComponent - Full detail view with actions" -print_success "✓ ApplicationFormComponent - Create/Edit with validation" -print_success "✓ Backend verification - All files present" -echo "" -echo "Next steps:" -echo " 1. Rebuild the frontend: cd frontend && npm run build" -echo " 2. Restart Docker containers: docker-compose restart app" -echo " 3. Test the application at: http://localhost/applications" -echo "" -echo "Features implemented:" -echo " • Full CRUD operations for applications" -echo " • Status filtering (IDEA, IN_DEVELOPMENT, IN_SERVICE, MAINTENANCE, DECOMMISSIONED)" -echo " • Business Unit filtering" -echo " • Search by application name with debounce" -echo " • Quick status change from list view" -echo " • Date validation (End of Support before End of Life)" -echo " • Pagination (20 items per page)" -echo " • Colored status badges" -echo "" -print_success "Story 2 deployment complete!" -echo "=========================================="