1
0
mirror of https://github.com/bpatrik/pigallery2.git synced 2024-12-14 11:23:17 +02:00
pigallery2/frontend/app/gallery/gallery.service.ts

106 lines
3.7 KiB
TypeScript
Raw Normal View History

2016-05-09 17:04:56 +02:00
import {Injectable} from "@angular/core";
2016-12-27 00:36:38 +02:00
import {NetworkService} from "../model/network/network.service";
2016-03-20 17:54:30 +02:00
import {Message} from "../../../common/entities/Message";
import {ContentWrapper} from "../../../common/entities/ConentWrapper";
2016-05-09 21:43:52 +02:00
import {Photo} from "../../../common/entities/Photo";
import {Directory} from "../../../common/entities/Directory";
2016-05-16 11:03:11 +02:00
import {SearchTypes} from "../../../common/entities/AutoCompleteItem";
2016-06-26 11:08:05 +02:00
import {GalleryCacheService} from "./cache.gallery.service";
2016-03-20 17:54:30 +02:00
@Injectable()
2016-05-09 17:04:56 +02:00
export class GalleryService {
public content:ContentWrapper;
2016-05-09 21:43:52 +02:00
private lastDirectory:Directory;
private searchId:any;
2016-06-26 11:08:05 +02:00
constructor(private networkService:NetworkService, private galleryCacheService:GalleryCacheService) {
this.content = new ContentWrapper();
2016-03-20 17:54:30 +02:00
}
2016-12-27 00:36:38 +02:00
lastRequest: {directory: any} = {
2016-06-26 11:08:05 +02:00
directory: null
};
public getDirectory(directoryName:string):Promise<Message<ContentWrapper>> {
2016-05-16 23:15:03 +02:00
this.content = new ContentWrapper();
2016-06-26 11:08:05 +02:00
this.content.directory = this.galleryCacheService.getDirectory(directoryName);
this.content.searchResult = null;
this.lastRequest.directory = directoryName;
return this.networkService.getJson("/gallery/content/" + directoryName).then(
(message:Message<ContentWrapper>) => {
if (!message.error && message.result) {
2016-05-16 23:15:03 +02:00
2016-06-26 11:08:05 +02:00
this.galleryCacheService.setDirectory(message.result.directory); //save it before adding references
if (this.lastRequest.directory != directoryName) {
return;
}
2016-07-04 18:12:58 +02:00
message.result.directory.photos.forEach((photo:Photo) => {
photo.metadata.creationDate = new Date(<any>photo.metadata.creationDate);
});
2016-05-09 21:43:52 +02:00
message.result.directory.photos.forEach((photo:Photo) => {
photo.directory = message.result.directory;
});
2016-05-16 23:15:03 +02:00
2016-05-09 21:43:52 +02:00
this.lastDirectory = message.result.directory;
this.content = message.result;
}
return message;
});
}
2016-05-09 21:43:52 +02:00
//TODO: cache
2016-05-16 11:03:11 +02:00
public search(text:string, type?:SearchTypes):Promise<Message<ContentWrapper>> {
clearTimeout(this.searchId);
2016-05-09 21:43:52 +02:00
if (text === null || text === '') {
return Promise.resolve(new Message(null, null));
}
2016-05-16 11:03:11 +02:00
2016-05-16 19:36:04 +02:00
let queryString = "/search/" + text;
2016-05-16 11:03:11 +02:00
if (type) {
queryString += "?type=" + type;
}
2016-06-26 11:08:05 +02:00
return this.networkService.getJson(queryString).then(
(message:Message<ContentWrapper>) => {
if (!message.error && message.result) {
this.content = message.result;
}
return message;
});
}
2016-05-09 21:43:52 +02:00
//TODO: cache (together with normal search)
public instantSearch(text:string):Promise<Message<ContentWrapper>> {
2016-05-09 21:43:52 +02:00
if (text === null || text === '') {
this.content.directory = this.lastDirectory;
this.content.searchResult = null;
clearTimeout(this.searchId);
return Promise.resolve(new Message(null, null));
}
if (this.searchId != null) {
clearTimeout(this.searchId);
}
this.searchId = setTimeout(() => {
this.search(text);
this.searchId = null;
}, 3000); //TODO: set timeout to config
2016-06-26 11:08:05 +02:00
return this.networkService.getJson("/instant-search/" + text).then(
(message:Message<ContentWrapper>) => {
if (!message.error && message.result) {
this.content = message.result;
}
return message;
});
2016-05-09 21:43:52 +02:00
2016-03-20 17:54:30 +02:00
}
}