tns-template-master-detail-kinvey-ng
Version:
Master-detail interface to display collection of items from Kinvey and inspect and edit selected item properties.
122 lines (100 loc) • 3.76 kB
text/typescript
import { Injectable } from "@angular/core";
// TODO: should be imported from kinvey-nativescript-sdk/angular but declaration file is currently missing
import { DataStoreService, FilesService, UserService, Query } from "kinvey-nativescript-sdk/lib/angular";
import { File } from "tns-core-modules/file-system";
import { Config } from "../../shared/config";
import { Car } from "./car.model";
const editableProperties = [
"class",
"doors",
"hasAC",
"transmission",
"luggage",
"name",
"price",
"seats",
"imageUrl"
];
export class CarService {
private static cloneUpdateModel(car: Car): object {
// tslint:disable-next-line:ban-comma-operator
return editableProperties.reduce((a, e) => (a[e] = car[e], a), { _id: car.id });
}
private _allCars: Array<Car> = [];
private _carsStore = null;
constructor(
dataStoreService: DataStoreService,
private _filesService: FilesService,
private _userService: UserService) {
this._carsStore = dataStoreService.collection("cars");
}
getCarById(id: string): Car {
if (!id) {
return;
}
return this._allCars.filter((car) => {
return car.id === id;
})[0];
}
load(): Promise<any> {
return this.login().then(() => {
return this._carsStore.sync();
}).then(() => {
const sortByNameQuery = new Query();
sortByNameQuery.ascending("name");
const stream = this._carsStore.find(sortByNameQuery);
return stream.toPromise();
}).then((data) => {
this._allCars = [];
data.forEach((carData: any) => {
carData.id = carData._id;
const car = new Car(carData);
this._allCars.push(car);
});
return this._allCars;
});
}
update(carModel: Car): Promise<any> {
const updateModel = CarService.cloneUpdateModel(carModel);
return this._carsStore.save(updateModel);
}
uploadImage(remoteFullPath: string, localFullPath: string): Promise<any> {
const imageFile = File.fromPath(localFullPath);
const imageContent = imageFile.readSync();
const metadata = {
filename: imageFile.name,
mimeType: this.getMimeType(imageFile.extension),
size: imageContent.length,
public: true
};
return this._filesService.upload(imageFile, metadata, { timeout: 2147483647 })
.then((uploadedFile: any) => {
const query = new Query();
query.equalTo("_id", uploadedFile._id);
return this._filesService.find(query);
})
.then((files: Array<any>) => {
if (files && files.length) {
const file = files[0];
file.url = file._downloadURL;
return file;
} else {
Promise.reject(new Error("No items with the given ID could be found."));
}
});
}
private login(): Promise<any> {
if (!!this._userService.getActiveUser()) {
return Promise.resolve();
} else {
return this._userService.login(Config.kinveyUsername, Config.kinveyPassword);
}
}
private getMimeType(imageExtension: string): string {
const extension = imageExtension === "jpg" ? "jpeg" : imageExtension;
return "image/" + extension.replace(/\./g, "");
}
}