Commit 99f0042f authored by Aravind RK's avatar Aravind RK

feat : signature is turned to base64 inorder to

parent 669ca3f1
...@@ -125,24 +125,19 @@ router.get('/me', protect, async (req, res) => { ...@@ -125,24 +125,19 @@ router.get('/me', protect, async (req, res) => {
// @route POST /api/auth/signature // @route POST /api/auth/signature
// @desc Upload digital signature image // @desc Upload digital signature image
// @access Private // @access Private
router.post('/signature', protect, upload.single('signature'), async (req, res) => { router.post('/signature', protect, async (req, res) => {
try { try {
const user = await User.findById(req.user._id); const user = await User.findById(req.user._id);
if (!user) return res.status(404).json({ message: 'User not found' }); if (!user) return res.status(404).json({ message: 'User not found' });
if (!req.file) { const { signature } = req.body;
return res.status(400).json({ message: 'Please upload an image file' }); if (!signature) {
return res.status(400).json({ message: 'Please provide a base64 signature' });
} }
if (user.signature) { await User.updateOne({ _id: user._id }, { signature });
const oldPath = path.join(__dirname, '..', 'uploads', path.basename(user.signature));
if (fs.existsSync(oldPath)) fs.unlinkSync(oldPath);
}
const newSignaturePath = `/uploads/${req.file.filename}`;
await User.updateOne({ _id: user._id }, { signature: newSignaturePath });
res.json({ message: 'Signature uploaded successfully', signature: newSignaturePath }); res.json({ message: 'Signature saved successfully', signature });
} catch (error) { } catch (error) {
res.status(500).json({ message: 'Server error', error: error.message }); res.status(500).json({ message: 'Server error', error: error.message });
} }
......
...@@ -544,7 +544,7 @@ ...@@ -544,7 +544,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (ev.evaluatorId?.signature) { @if (ev.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -383,7 +383,7 @@ ...@@ -383,7 +383,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) { @if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -544,7 +544,7 @@ ...@@ -544,7 +544,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (ev.evaluatorId?.signature) { @if (ev.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -388,7 +388,7 @@ ...@@ -388,7 +388,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) { @if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -806,7 +806,7 @@ ...@@ -806,7 +806,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (ev.evaluatorId?.signature) { @if (ev.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -515,7 +515,7 @@ ...@@ -515,7 +515,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) { @if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -218,7 +218,7 @@ export class UserHistoryComponent implements OnInit { ...@@ -218,7 +218,7 @@ export class UserHistoryComponent implements OnInit {
const getSigHtml = (evalObj: any, fallbackName: string) => { const getSigHtml = (evalObj: any, fallbackName: string) => {
if (evalObj && evalObj.evaluatorId && evalObj.evaluatorId.signature) { if (evalObj && evalObj.evaluatorId && evalObj.evaluatorId.signature) {
return `<img src="http://localhost:5000${evalObj.evaluatorId.signature}" alt="Signature"/>`; return `<img src="${evalObj.evaluatorId.signature}" alt="Signature"/>`;
} }
return fallbackName || ''; return fallbackName || '';
}; };
......
...@@ -807,7 +807,7 @@ ...@@ -807,7 +807,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (ev.evaluatorId?.signature) { @if (ev.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="ev.evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -515,7 +515,7 @@ ...@@ -515,7 +515,7 @@
<div class="print-signature" style="display: flex; align-items: flex-end;"> <div class="print-signature" style="display: flex; align-items: flex-end;">
<strong>Evaluator's Signature:</strong> <strong>Evaluator's Signature:</strong>
@if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) { @if (getEvaluationByRole(roleObj.id)?.evaluatorId?.signature) {
<img [src]="'http://localhost:5000' + getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;"> <img [src]="getEvaluationByRole(roleObj.id).evaluatorId.signature" style="max-height: 40px; margin-left: 10px;">
} @else { } @else {
<span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span> <span style="border-bottom: 1px solid #000; display: inline-block; width: 150px; margin-left: 10px;"></span>
} }
......
...@@ -218,7 +218,7 @@ export class HRUserHistoryComponent implements OnInit { ...@@ -218,7 +218,7 @@ export class HRUserHistoryComponent implements OnInit {
const getSigHtml = (evalObj: any, fallbackName: string) => { const getSigHtml = (evalObj: any, fallbackName: string) => {
if (evalObj && evalObj.evaluatorId && evalObj.evaluatorId.signature) { if (evalObj && evalObj.evaluatorId && evalObj.evaluatorId.signature) {
return `<img src="http://localhost:5000${evalObj.evaluatorId.signature}" style="max-height:35px; width:auto; object-fit:contain; vertical-align:bottom; display:block; margin:auto;" alt="${fallbackName}'s Signature"/>`; return `<img src="${evalObj.evaluatorId.signature}" style="max-height:35px; width:auto; object-fit:contain; vertical-align:bottom; display:block; margin:auto;" alt="${fallbackName}'s Signature"/>`;
} }
return fallbackName || ''; return fallbackName || '';
}; };
......
...@@ -85,23 +85,29 @@ export class StaffProfileComponent implements OnInit { ...@@ -85,23 +85,29 @@ export class StaffProfileComponent implements OnInit {
const file = event.target.files[0]; const file = event.target.files[0];
if (!file) return; if (!file) return;
this.isUploadingSignature.set(true); const reader = new FileReader();
const formData = new FormData(); reader.onload = () => {
formData.append('signature', file); const base64String = reader.result as string;
this.isUploadingSignature.set(true);
this.authService.uploadSignature(formData).subscribe({
next: (res) => { this.authService.uploadSignature({ signature: base64String }).subscribe({
this.isUploadingSignature.set(false); next: (res) => {
if (res.signature) { this.isUploadingSignature.set(false);
// Update user signal if (res.signature) {
this.user.update(u => ({ ...u, signature: res.signature })); // Update user signal
this.user.update(u => ({ ...u, signature: res.signature }));
}
},
error: (err) => {
this.isUploadingSignature.set(false);
alert(err.error?.message || 'Error uploading signature');
} }
}, });
error: (err) => { };
this.isUploadingSignature.set(false); reader.onerror = () => {
alert(err.error?.message || 'Error uploading signature'); alert('Failed to read file');
} };
}); reader.readAsDataURL(file);
} }
deleteSignature(): void { deleteSignature(): void {
...@@ -116,6 +122,7 @@ export class StaffProfileComponent implements OnInit { ...@@ -116,6 +122,7 @@ export class StaffProfileComponent implements OnInit {
getSignatureUrl(): string { getSignatureUrl(): string {
const signature = this.user()?.signature; const signature = this.user()?.signature;
if (!signature) return ''; if (!signature) return '';
return `http://localhost:5000${signature}`; // Since signature is a base64 data URI, we just return it directly
return signature;
} }
} }
...@@ -56,8 +56,8 @@ export class AuthService { ...@@ -56,8 +56,8 @@ export class AuthService {
return this.http.get(`${this.apiUrl}/me`); return this.http.get(`${this.apiUrl}/me`);
} }
uploadSignature(formData: FormData): Observable<any> { uploadSignature(payload: { signature: string }): Observable<any> {
return this.http.post(`${this.apiUrl}/signature`, formData); return this.http.post(`${this.apiUrl}/signature`, payload);
} }
updateProfile(formData: FormData): Observable<any> { updateProfile(formData: FormData): Observable<any> {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment