mirror of
https://github.com/richard-loafle/fuse-angular.git
synced 2025-04-10 10:31:37 +00:00
352 lines
13 KiB
TypeScript
352 lines
13 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
import { FuseMockApiService, FuseMockApiUtils } from '@fuse/lib/mock-api';
|
|
import { contacts as contactsData, countries as countriesData, tags as tagsData } from 'app/mock-api/apps/contacts/data';
|
|
import { assign, cloneDeep } from 'lodash-es';
|
|
import { from, map } from 'rxjs';
|
|
|
|
@Injectable({providedIn: 'root'})
|
|
export class ContactsMockApi
|
|
{
|
|
private _contacts: any[] = contactsData;
|
|
private _countries: any[] = countriesData;
|
|
private _tags: any[] = tagsData;
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
constructor(private _fuseMockApiService: FuseMockApiService)
|
|
{
|
|
// Register Mock API handlers
|
|
this.registerHandlers();
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Public methods
|
|
// -----------------------------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Register Mock API handlers
|
|
*/
|
|
registerHandlers(): void
|
|
{
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contacts - GET
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onGet('api/apps/contacts/all')
|
|
.reply(() =>
|
|
{
|
|
// Clone the contacts
|
|
const contacts = cloneDeep(this._contacts);
|
|
|
|
// Sort the contacts by the name field by default
|
|
contacts.sort((a, b) => a.name.localeCompare(b.name));
|
|
|
|
// Return the response
|
|
return [200, contacts];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contacts Search - GET
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onGet('api/apps/contacts/search')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the search query
|
|
const query = request.params.get('query');
|
|
|
|
// Clone the contacts
|
|
let contacts = cloneDeep(this._contacts);
|
|
|
|
// If the query exists...
|
|
if ( query )
|
|
{
|
|
// Filter the contacts
|
|
contacts = contacts.filter(contact => contact.name && contact.name.toLowerCase().includes(query.toLowerCase()));
|
|
}
|
|
|
|
// Sort the contacts by the name field by default
|
|
contacts.sort((a, b) => a.name.localeCompare(b.name));
|
|
|
|
// Return the response
|
|
return [200, contacts];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contact - GET
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onGet('api/apps/contacts/contact')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id from the params
|
|
const id = request.params.get('id');
|
|
|
|
// Clone the contacts
|
|
const contacts = cloneDeep(this._contacts);
|
|
|
|
// Find the contact
|
|
const contact = contacts.find(item => item.id === id);
|
|
|
|
// Return the response
|
|
return [200, contact];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contact - POST
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onPost('api/apps/contacts/contact')
|
|
.reply(() =>
|
|
{
|
|
// Generate a new contact
|
|
const newContact = {
|
|
id : FuseMockApiUtils.guid(),
|
|
avatar : null,
|
|
name : 'New Contact',
|
|
emails : [],
|
|
phoneNumbers: [],
|
|
job : {
|
|
title : '',
|
|
company: '',
|
|
},
|
|
birthday : null,
|
|
address : null,
|
|
notes : null,
|
|
tags : [],
|
|
};
|
|
|
|
// Unshift the new contact
|
|
this._contacts.unshift(newContact);
|
|
|
|
// Return the response
|
|
return [200, newContact];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contact - PATCH
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onPatch('api/apps/contacts/contact')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id and contact
|
|
const id = request.body.id;
|
|
const contact = cloneDeep(request.body.contact);
|
|
|
|
// Prepare the updated contact
|
|
let updatedContact = null;
|
|
|
|
// Find the contact and update it
|
|
this._contacts.forEach((item, index, contacts) =>
|
|
{
|
|
if ( item.id === id )
|
|
{
|
|
// Update the contact
|
|
contacts[index] = assign({}, contacts[index], contact);
|
|
|
|
// Store the updated contact
|
|
updatedContact = contacts[index];
|
|
}
|
|
});
|
|
|
|
// Return the response
|
|
return [200, updatedContact];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Contact - DELETE
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onDelete('api/apps/contacts/contact')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id
|
|
const id = request.params.get('id');
|
|
|
|
// Find the contact and delete it
|
|
this._contacts.forEach((item, index) =>
|
|
{
|
|
if ( item.id === id )
|
|
{
|
|
this._contacts.splice(index, 1);
|
|
}
|
|
});
|
|
|
|
// Return the response
|
|
return [200, true];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Countries - GET
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onGet('api/apps/contacts/countries')
|
|
.reply(() => [200, cloneDeep(this._countries)]);
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Tags - GET
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onGet('api/apps/contacts/tags')
|
|
.reply(() => [200, cloneDeep(this._tags)]);
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Tags - POST
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onPost('api/apps/contacts/tag')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the tag
|
|
const newTag = cloneDeep(request.body.tag);
|
|
|
|
// Generate a new GUID
|
|
newTag.id = FuseMockApiUtils.guid();
|
|
|
|
// Unshift the new tag
|
|
this._tags.unshift(newTag);
|
|
|
|
// Return the response
|
|
return [200, newTag];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Tags - PATCH
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onPatch('api/apps/contacts/tag')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id and tag
|
|
const id = request.body.id;
|
|
const tag = cloneDeep(request.body.tag);
|
|
|
|
// Prepare the updated tag
|
|
let updatedTag = null;
|
|
|
|
// Find the tag and update it
|
|
this._tags.forEach((item, index, tags) =>
|
|
{
|
|
if ( item.id === id )
|
|
{
|
|
// Update the tag
|
|
tags[index] = assign({}, tags[index], tag);
|
|
|
|
// Store the updated tag
|
|
updatedTag = tags[index];
|
|
}
|
|
});
|
|
|
|
// Return the response
|
|
return [200, updatedTag];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Tag - DELETE
|
|
// -----------------------------------------------------------------------------------------------------
|
|
this._fuseMockApiService
|
|
.onDelete('api/apps/contacts/tag')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id
|
|
const id = request.params.get('id');
|
|
|
|
// Find the tag and delete it
|
|
this._tags.forEach((item, index) =>
|
|
{
|
|
if ( item.id === id )
|
|
{
|
|
this._tags.splice(index, 1);
|
|
}
|
|
});
|
|
|
|
// Get the contacts that have the tag
|
|
const contactsWithTag = this._contacts.filter(contact => contact.tags.indexOf(id) > -1);
|
|
|
|
// Iterate through them and delete the tag
|
|
contactsWithTag.forEach((contact) =>
|
|
{
|
|
contact.tags.splice(contact.tags.indexOf(id), 1);
|
|
});
|
|
|
|
// Return the response
|
|
return [200, true];
|
|
});
|
|
|
|
// -----------------------------------------------------------------------------------------------------
|
|
// @ Avatar - POST
|
|
// -----------------------------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Read the given file as mock-api url
|
|
*
|
|
* @param file
|
|
*/
|
|
const readAsDataURL = (file: File): Promise<any> =>
|
|
|
|
// Return a new promise
|
|
new Promise((resolve, reject) =>
|
|
{
|
|
// Create a new reader
|
|
const reader = new FileReader();
|
|
|
|
// Resolve the promise on success
|
|
reader.onload = (): void =>
|
|
{
|
|
resolve(reader.result);
|
|
};
|
|
|
|
// Reject the promise on error
|
|
reader.onerror = (e): void =>
|
|
{
|
|
reject(e);
|
|
};
|
|
|
|
// Read the file as the
|
|
reader.readAsDataURL(file);
|
|
})
|
|
;
|
|
|
|
this._fuseMockApiService
|
|
.onPost('api/apps/contacts/avatar')
|
|
.reply(({request}) =>
|
|
{
|
|
// Get the id and avatar
|
|
const id = request.body.id;
|
|
const avatar = request.body.avatar;
|
|
|
|
// Prepare the updated contact
|
|
let updatedContact: any = null;
|
|
|
|
// In a real world application, this would return the path
|
|
// of the saved image file (from host, S3 bucket, etc.) but,
|
|
// for the sake of the demo, we encode the image to base64
|
|
// and return it as the new path of the uploaded image since
|
|
// the src attribute of the img tag works with both image urls
|
|
// and encoded images.
|
|
return from(readAsDataURL(avatar)).pipe(
|
|
map((path) =>
|
|
{
|
|
// Find the contact and update it
|
|
this._contacts.forEach((item, index, contacts) =>
|
|
{
|
|
if ( item.id === id )
|
|
{
|
|
// Update the avatar
|
|
contacts[index].avatar = path;
|
|
|
|
// Store the updated contact
|
|
updatedContact = contacts[index];
|
|
}
|
|
});
|
|
|
|
// Return the response
|
|
return [200, updatedContact];
|
|
}),
|
|
);
|
|
});
|
|
}
|
|
}
|