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-05-09 19:14:33 +02:00
|
|
|
import {ContentWrapper} from "../../../common/entities/ConentWrapper";
|
2017-07-20 23:00:49 +02:00
|
|
|
import {DirectoryDTO} from "../../../common/entities/DirectoryDTO";
|
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";
|
2017-06-21 13:47:21 +02:00
|
|
|
import {BehaviorSubject} from "rxjs/BehaviorSubject";
|
2017-07-03 19:17:49 +02:00
|
|
|
import {SharingDTO} from "../../../common/entities/SharingDTO";
|
|
|
|
import {Config} from "../../../common/config/public/Config";
|
|
|
|
import {ShareService} from "./share.service";
|
2016-03-20 17:54:30 +02:00
|
|
|
|
|
|
|
@Injectable()
|
2016-05-09 17:04:56 +02:00
|
|
|
export class GalleryService {
|
2016-05-05 17:51:51 +02:00
|
|
|
|
2017-06-21 13:47:21 +02:00
|
|
|
public content: BehaviorSubject<ContentWrapper>;
|
2017-06-10 22:32:56 +02:00
|
|
|
private lastDirectory: DirectoryDTO;
|
|
|
|
private searchId: any;
|
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
constructor(private networkService: NetworkService,
|
|
|
|
private galleryCacheService: GalleryCacheService,
|
|
|
|
private _shareService: ShareService) {
|
2017-06-21 13:47:21 +02:00
|
|
|
this.content = new BehaviorSubject<ContentWrapper>(new ContentWrapper());
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
lastRequest: { directory: string } = {
|
|
|
|
directory: null
|
|
|
|
};
|
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
public async getDirectory(directoryName: string): Promise<ContentWrapper> {
|
2017-06-21 13:47:21 +02:00
|
|
|
const content = new ContentWrapper();
|
2017-06-10 22:32:56 +02:00
|
|
|
|
2017-06-21 13:47:21 +02:00
|
|
|
content.directory = this.galleryCacheService.getDirectory(directoryName);
|
|
|
|
content.searchResult = null;
|
|
|
|
|
|
|
|
this.content.next(content);
|
2017-06-10 22:32:56 +02:00
|
|
|
this.lastRequest.directory = directoryName;
|
|
|
|
|
2017-07-19 20:47:09 +02:00
|
|
|
const params = {};
|
2017-07-03 19:17:49 +02:00
|
|
|
if (Config.Client.Sharing.enabled == true) {
|
|
|
|
if (this._shareService.isSharing()) {
|
2017-07-19 20:47:09 +02:00
|
|
|
params['sk'] = this._shareService.getSharingKey();
|
2017-07-03 19:17:49 +02:00
|
|
|
}
|
|
|
|
}
|
2017-07-08 00:18:24 +02:00
|
|
|
|
2017-07-21 19:14:22 +02:00
|
|
|
if (content.directory && content.directory.lastModified && content.directory.lastScanned &&
|
|
|
|
!content.directory.isPartial) {
|
2017-07-19 20:47:09 +02:00
|
|
|
params['knownLastModified'] = content.directory.lastModified;
|
|
|
|
params['knownLastScanned'] = content.directory.lastScanned;
|
2017-07-03 19:17:49 +02:00
|
|
|
}
|
2017-06-10 22:32:56 +02:00
|
|
|
|
2017-07-19 20:47:09 +02:00
|
|
|
|
|
|
|
const cw = await this.networkService.getJson<ContentWrapper>("/gallery/content/" + directoryName, params);
|
|
|
|
|
|
|
|
|
2017-07-20 23:00:49 +02:00
|
|
|
if (!cw || cw.notModified == true) {
|
2017-07-16 10:59:28 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-07-20 23:00:49 +02:00
|
|
|
this.galleryCacheService.setDirectory(cw.directory); //save it before adding references
|
2017-06-10 22:32:56 +02:00
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
if (this.lastRequest.directory != directoryName) {
|
|
|
|
return;
|
|
|
|
}
|
2017-03-18 01:11:53 +02:00
|
|
|
|
2016-05-09 19:14:33 +02:00
|
|
|
|
2017-07-19 20:47:09 +02:00
|
|
|
DirectoryDTO.addReferences(<DirectoryDTO>cw.directory);
|
2016-05-16 11:03:11 +02:00
|
|
|
|
2017-06-21 13:47:21 +02:00
|
|
|
|
2017-07-19 20:47:09 +02:00
|
|
|
this.lastDirectory = <DirectoryDTO>cw.directory;
|
2017-07-03 19:17:49 +02:00
|
|
|
this.content.next(cw);
|
2017-06-21 13:47:21 +02:00
|
|
|
|
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
return cw;
|
2017-06-21 13:47:21 +02:00
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//TODO: cache
|
2017-07-03 19:17:49 +02:00
|
|
|
public async search(text: string, type?: SearchTypes): Promise<ContentWrapper> {
|
2017-06-10 22:32:56 +02:00
|
|
|
clearTimeout(this.searchId);
|
2017-07-08 00:18:24 +02:00
|
|
|
if (text === null || text === '' || text.trim() == ".") {
|
2017-07-03 19:17:49 +02:00
|
|
|
return null
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
2016-05-16 11:03:11 +02:00
|
|
|
|
2017-07-19 20:47:09 +02:00
|
|
|
const cw: ContentWrapper = await this.networkService.getJson<ContentWrapper>("/search/" + text, {type: type});
|
2017-07-25 21:36:28 +02:00
|
|
|
console.log("photos", cw.searchResult.photos.length);
|
|
|
|
console.log("direcotries", cw.searchResult.directories.length);
|
2017-07-03 19:17:49 +02:00
|
|
|
this.content.next(cw);
|
|
|
|
return cw;
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//TODO: cache (together with normal search)
|
2017-07-03 19:17:49 +02:00
|
|
|
public async instantSearch(text: string): Promise<ContentWrapper> {
|
2017-07-08 00:18:24 +02:00
|
|
|
if (text === null || text === '' || text.trim() == ".") {
|
2017-06-21 13:47:21 +02:00
|
|
|
const content = new ContentWrapper();
|
|
|
|
content.directory = this.lastDirectory;
|
|
|
|
content.searchResult = null;
|
|
|
|
this.content.next(content);
|
2017-06-10 22:32:56 +02:00
|
|
|
clearTimeout(this.searchId);
|
2017-07-03 19:17:49 +02:00
|
|
|
return null
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
2016-05-09 21:43:52 +02:00
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
if (this.searchId != null) {
|
|
|
|
clearTimeout(this.searchId);
|
2016-05-09 21:43:52 +02:00
|
|
|
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
|
|
|
this.searchId = setTimeout(() => {
|
|
|
|
this.search(text);
|
|
|
|
this.searchId = null;
|
2017-07-21 19:33:24 +02:00
|
|
|
}, Config.Client.Search.InstantSearchTimeout); //TODO: set timeout to config
|
2017-06-10 22:32:56 +02:00
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
const cw = await this.networkService.getJson<ContentWrapper>("/instant-search/" + text);
|
|
|
|
this.content.next(cw);
|
|
|
|
return cw;
|
|
|
|
|
|
|
|
}
|
2016-05-09 21:43:52 +02:00
|
|
|
|
2017-07-03 19:17:49 +02:00
|
|
|
public async getSharing(sharingKey: string): Promise<SharingDTO> {
|
|
|
|
return this.networkService.getJson<SharingDTO>("/share/" + sharingKey);
|
2017-06-10 22:32:56 +02:00
|
|
|
}
|
2016-03-20 17:54:30 +02:00
|
|
|
|
|
|
|
}
|