Update the type of data in project

This commit is contained in:
2023-09-27 17:08:54 +07:00
parent b48089ffe4
commit 50c19ff6c4
11 changed files with 227 additions and 5610 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
+1 -1
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
@@ -26,6 +26,6 @@ export const UPDATE_TRANSACTION_SUCCESS = 'Update success!';
export const REGISTER_SUCCESS = 'Register Success';
export const REQUIRED_MESSAGE = (field) => `The ${field} is required!`;
export const REQUIRED_MESSAGE = (field: string) => `The ${field} is required!`;
export const INVALID_EMAIL_FORMAT = `The email is not correct!`;
+22 -6
View File
@@ -1,6 +1,7 @@
import * as MESSAGE from '../constants/message';
import { TIME_OUT_SEC, REGEX } from '../constants/config';
import FirebaseService from '../services/firebaseService';
import { dataObj } from './interface';
/**
* Validate password
@@ -45,10 +46,10 @@ export const createIdUser = (): number => {
* @param {Function} action The action need to be perform.
* @returns { Object || Error } Return the any object from Firebase or Error
*/
export const timeOutConnect = async (
action: Promise<object>,
): Promise<string | object> => {
const result: object | string = await Promise.race([
export const timeOutConnect = async <T>(
action: Promise<T>,
): Promise<string | T> => {
const result: T | string = await Promise.race([
action,
timeout(TIME_OUT_SEC),
]);
@@ -56,7 +57,7 @@ export const timeOutConnect = async (
return result;
};
export const renderRequiredText = (field: string, element: Element) => {
export const renderRequiredText = (field: string, element: Element): void => {
const markup: string = `
<p class="error-text">${MESSAGE.REQUIRED_MESSAGE(field)}</p>
`;
@@ -64,6 +65,21 @@ export const renderRequiredText = (field: string, element: Element) => {
element.insertAdjacentHTML('afterend', markup);
};
export const redirectToLoginPage = () => {
export const redirectToLoginPage = (): void => {
window.location.replace('/login');
};
export const convertDataObjectToModel = (dataObj: {
id: string;
data: object;
}): dataObj => {
const { id } = dataObj;
return { id, ...dataObj.data } as dataObj;
};
export const convertModelToDataObject = <T extends dataObj>(model: T): T => {
const { id, ...data } = model;
return { id, data } as T;
};
@@ -0,0 +1,4 @@
export interface dataObj {
id: string;
data: object;
}
+18
View File
@@ -0,0 +1,18 @@
import { createIdUser } from '../helpers/helpers';
export default class User {
private id: number;
private email: string;
private password: string;
private accessToken: string;
constructor(email: string, password: string, accessToken: string) {
this.id = createIdUser();
this.email = email;
this.password = password;
this.accessToken = accessToken;
}
}
@@ -1,43 +1,30 @@
import {
timeOutConnect,
convertDataObjectToModel,
convertModelToDataObject,
timeOutConnect,
} from '../helpers/helpers';
import { dataObj } from '../helpers/interface';
import FirebaseService from './firebaseService';
export default class CommonService {
constructor() {
this.defaultPath = '/';
this.firebaseService = FirebaseService;
}
export default class CommonService<T extends dataObj> {
private defaultPath: string = '/';
private firebaseService = FirebaseService;
/**
* Connect to Firebase Databse
* Connect to Firebase Database
*/
connectToDb() {
this.firebaseService.reconnect();
}
async getDataFromProp(property, value, path = this.defaultPath) {
this.connectToDb();
const data = this.firebaseService.getDataFromProp(path, property, value);
const result = await timeOutConnect(data);
if (result.id && result.data) {
return convertDataObjectToModel(result);
}
return null;
}
/**
* Save data on database
* @param {*} data The data wants to save on database
* @param {string} path The path of database
*/
async save(model) {
async save(model: T): Promise<void> {
this.connectToDb();
const results = convertModelToDataObject(model);
const results: T = convertModelToDataObject(model);
const saveData = this.firebaseService.save(
results.data,
@@ -53,52 +40,70 @@ export default class CommonService {
* @param {string} path The path of database
* @returns {Object || null} Return the object if has, otherwise return null
*/
async getDataFromId(id, path = this.defaultPath) {
async getDataFromId(
id: string,
path: string = this.defaultPath,
): Promise<object | null> {
this.connectToDb();
const result = await this.firebaseService.getDataFromId(id, path);
const data = await timeOutConnect(result);
if (data) return data;
const data = await timeOutConnect(
this.firebaseService.getDataFromId(id, path),
);
if (typeof data !== 'string') return data;
return null;
}
async getAllDataFromPath(path = this.defaultPath) {
async getAllDataFromPath(path = this.defaultPath): Promise<object[] | null> {
this.connectToDb();
const results = await timeOutConnect(
this.firebaseService.getAllDataFromPath(path),
);
if (results) {
if (typeof results !== 'string') {
// Convert format object
return results.map((data) => {
return convertDataObjectToModel(data);
const tempData: dataObj = data as dataObj;
return convertDataObjectToModel(tempData);
});
}
return null;
}
async getListDataFromProp(property, value, path = this.defaultPath) {
async getListDataFromProp(
property: string,
value: object,
path: string = this.defaultPath,
): Promise<object[] | null> {
this.connectToDb();
const results = await timeOutConnect(
this.firebaseService.getListDataFromProp(path, property, value),
);
if (results) {
if (results && typeof results !== 'string') {
// Convert format object
return results.map((data) => {
return convertDataObjectToModel(data);
const tempData: dataObj = data as dataObj;
return convertDataObjectToModel(tempData);
});
}
return null;
}
async deleteData(id, path = this.defaultPath) {
async deleteData(
id: string,
path = this.defaultPath,
): Promise<string | void> {
this.connectToDb();
await timeOutConnect(this.firebaseService.delete(id, path));
}
}
@@ -29,25 +29,25 @@ class FirebaseService {
* @param {string} path The path of database need to be save
* @returns {Promise} Return the resolves when write to database completed
*/
save(data: object, path: string): Promise<any> {
save(data: object, path: string): Promise<void> {
return set(ref(this.db, path), data);
}
delete(id: string, path: string) {
delete(id: string, path: string): Promise<void> {
return remove(ref(this.db, path + id));
}
/**
* Disconnect to database
*/
disconnect() {
disconnect(): void {
goOffline(this.db);
}
/**
* Reconnect to database
*/
reconnect() {
reconnect(): void {
goOnline(this.db);
}
@@ -58,13 +58,18 @@ class FirebaseService {
* @param {value} value The value to compare in database
* @returns {Promise} Return the resolve when find completed
*/
getDataFromProp(path: string, property: string, value: object): Promise<any> {
getDataFromProp(
path: string,
property: string,
value: object,
): Promise<object | null> {
return new Promise((resolve) => {
onValue(
ref(this.db, path),
(snapshot) => {
let id: string | null = null;
let data: object | null = null;
let result: object | null = null;
// snapshot is a type of data by Firebase define
snapshot.forEach((childSnapshot) => {
@@ -75,7 +80,12 @@ class FirebaseService {
data = dataTemp;
}
});
resolve({ id, data });
if (id && data) {
result = { id, data };
}
resolve(result);
},
{
onlyOnce: true,
@@ -90,7 +100,7 @@ class FirebaseService {
* @param {string} path The path of data save in database
* @returns {Promise} Return new Promise
*/
getDataFromId(id: string, path: string): Promise<any> {
getDataFromId(id: string, path: string): Promise<object> {
return new Promise((resolve) => {
onValue(
ref(this.db, path + id),
@@ -104,12 +114,12 @@ class FirebaseService {
});
}
getAllDataFromPath(path) {
getAllDataFromPath(path: string): Promise<object[]> {
return new Promise((resolve) => {
onValue(
ref(this.db, path),
(snapshot) => {
const listData: object[] = [];
let listData: object[] = [];
// snapshot is a type of data by Firebase define
snapshot.forEach((childSnapshot) => {
@@ -121,6 +131,7 @@ class FirebaseService {
listData.push({ id, data });
});
resolve(listData);
},
{
@@ -130,7 +141,11 @@ class FirebaseService {
});
}
getListDataFromProp(path: string, property: string, value: object) {
getListDataFromProp(
path: string,
property: string,
value: object,
): Promise<object[]> {
return new Promise((resolve) => {
onValue(
ref(this.db, path),
@@ -5,19 +5,19 @@ class LocalStorageService {
this.localStorage = localStorage;
}
add(key: string, value: string) {
add(key: string, value: string): void {
this.localStorage.setItem(key, value);
}
get(key: string) {
get(key: string): string | null {
return this.localStorage.getItem(key);
}
remove(key: string) {
remove(key: string): void {
this.localStorage.removeItem(key);
}
clear() {
clear(): void {
this.localStorage.clear();
}
}