implemented exhibition metadata storage

This commit is contained in:
2018-08-15 22:11:33 +02:00
parent 3f46d326cc
commit 46ada1d9fa
2 changed files with 79 additions and 21 deletions

View File

@@ -31,22 +31,22 @@ namespace RothenburgAR.Updater
public class VersioncheckAnswer
{
public List<string> languages { get; set; }
public List<Version> data { get; set; }
public List<ExhibitionVersion> data { get; set; }
}
[Serializable]
public class Version
public class ExhibitionVersion
{
public string id { get; set; }
public VersionInfo meta;
//VersionInfo tracker;
public VersionInfo meta { get; set; }
public VersionInfo tracker { get; set; }
}
[Serializable]
public class VersionInfo
{
public VersionStatus status;
public string updateUrl;
public VersionStatus status { get; set; }
public string updateUrl { get; set; }
}
public enum VersionStatus

View File

@@ -1,8 +1,11 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System;
using Newtonsoft.Json;
using RothenburgAR.Common;
using System.IO;
namespace RothenburgAR.Updater
{
@@ -12,11 +15,7 @@ namespace RothenburgAR.Updater
void Start()
{
/*
zum app-start einmal prüfen, wenn neues da ist anzeigen und evtl. runterladen (wenn nicht getaktete verbindung)
neue startszene, die guckt und updatet und dann zur mainScene weiterleitet
auf getaktete verbindung prüfen (Application.internetReachability)
/* TODO: allg. fragen
punkt zum eintragen der credentials? user will ja nur seine/nur bestimmte exhibitions haben schätz ich
oder beim update auswählen lassen, welche kommen sollen
*/
@@ -46,9 +45,9 @@ namespace RothenburgAR.Updater
Debug.Log(httpHandler.download.text);
//versionAnswer = JsonConvert.DeserializeObject<VersioncheckAnswer>(httpHandler.download.text);
VersionAnswer = JsonConvert.DeserializeObject<VersioncheckAnswer>(@"{""data"":[{""id"":""a"",""meta"":{""status"":""ok"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""}},{""id"":""b"",""meta"":{""status"":""updated"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""}}]}");
VersionAnswer = JsonConvert.DeserializeObject<VersioncheckAnswer>(@"{""data"":[{""id"":""a"",""meta"":{""status"":""ok"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""},""tracker"":""meta"":{""status"":""ok"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""}},{""id"":""b"",""meta"":{""status"":""updated"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""},""tracker"":""meta"":{""status"":""ok"",""updateUrl"":""https://lambdalike.pa.kaim.network/meta/006e164c-5e31-4ddf-adf5-df7016c8b3a7/de""}}]}");
if (VersionAnswer.data.TrueForAll(d => d.meta.status == VersionStatus.ok))
if (VersionAnswer.data.TrueForAll(d => d.meta.status == VersionStatus.ok && d.tracker.status == VersionStatus.ok))
{
// no updates required, continue to app
LoadMainScene();
@@ -68,15 +67,74 @@ namespace RothenburgAR.Updater
private void TriggerUpdate()
{
// TODO instantiate component that performs the update?
/* trigger tiered updates in order
* languages //no http
* data //no http
* tracker //1 request
* meta //1 request
* poi //n requests
* media //n requests
// TODO create centralized network error feedback hub thing
/*
* dir structure:
* data
* exhibitions
* id
* tracker.dat
* tracker.xml
* de
* meta.json
* en
* meta.json
* id
* ...
* poi
* ...
* media
* ...
*/
//TODO write languages to file the app can read
var updatedMeta = VersionAnswer.data.Where(d => d.meta.status == VersionStatus.updated).ToList();
var updatedTracker = VersionAnswer.data.Where(d => d.tracker.status == VersionStatus.updated).ToList();
updatedMeta.Union(updatedTracker).ToList().ForEach(updatedExhibition =>
{
// create exhibition directories
var path = Path.Combine(PathHelper.ExhibitionPath, updatedExhibition.id);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
});
updatedMeta.ForEach(d => UpdateMeta(d));
updatedTracker.ForEach(d => UpdateTracker(d));
var deletedMeta = VersionAnswer.data.Where(d => d.meta.status == VersionStatus.deleted).ToList();
var deletedTracker = VersionAnswer.data.Where(d => d.tracker.status == VersionStatus.deleted).ToList();
//TODO figure out if you can delete a tracker but not the meta (or vice versa)
}
private void UpdateMeta(ExhibitionVersion exhibition)
{
foreach (var lang in VersionAnswer.languages)
{
var path = Path.Combine(PathHelper.ExhibitionPath, lang);
var url = ApiInfo.ExhibitionEndpoint.Replace("{lang}", lang).Replace("{id}", exhibition.id);
var http = new HttpRequest(url, HttpVerb.GET).send();
http.operation.completed += ar =>
{
//TODO check for network errors/timeouts (and find out if operation.completed() is the right place for that)
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
File.WriteAllText(Path.Combine(path, "meta.json"), http.download.text, System.Text.Encoding.UTF8);
//TODO parse json into object and download poi data
};
}
}
private void UpdateTracker(ExhibitionVersion exhibition)
{
throw new NotImplementedException();
}
private static void LoadMainScene()