This commit is contained in:
2020-04-29 15:56:41 +00:00
parent b38a93ff86
commit 583876edfc
2 changed files with 167 additions and 72 deletions

View File

@@ -12,6 +12,8 @@ using System.IO.Compression;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
namespace AyaNova.PlugIn.V8
@@ -364,7 +366,8 @@ namespace AyaNova.PlugIn.V8
List<string> tags = new List<string>();
tags.Add(ImportTag);
//skip administrator
//skip administrator user fields
//but do export administrator
if (i.ID == User.AdministratorID) continue;
User c = User.GetItem(i.ID);
@@ -409,6 +412,13 @@ namespace AyaNova.PlugIn.V8
}
SetTags(d, tags);
//wiki page
var w = GetWikiContent(new TypeAndID(RootObjectTypes.User, c.ID));
if (w != null)
{
d.wiki = w;
}
//Custom fields?
if (ShouldExportCustom)
{
@@ -429,6 +439,10 @@ namespace AyaNova.PlugIn.V8
await util.PutAsync("UserOptions/" + RavenId.ToString(), d.ToString());
}
//Attachments / FILES
await ExportAttachments(new TypeAndID(RootObjectTypes.User, c.ID));
}
@@ -673,7 +687,7 @@ namespace AyaNova.PlugIn.V8
#endregion custom fields
#region WIKI page exporter
//WIKI
#region Wikiable objects reference
@@ -701,79 +715,13 @@ namespace AyaNova.PlugIn.V8
*/
#endregion
private async System.Threading.Tasks.Task<string> ExportWikiPageAndAttachments(TypeAndID tid)
private string GetWikiContent(TypeAndID tid)
{
//todo: upload attached files
//todo: return wiki as string
//may not exist
if (!WikiPage.HasWiki(tid.ID)) return null;
WikiPage w = WikiPage.GetItem(tid);
var content = w.GetContentAsString;
AyaFileList fl = AyaFileList.GetList(w.ID);
if (string.IsNullOrWhiteSpace(content) && fl.Count < 1) return null;
// //files
// foreach (AyaFileList.AyaFileListInfo i in fl)
// {
// //WikiFileInfo fi = new WikiFileInfo();
// // fi.Id = i.LT_O_AyaFile.Value.ToString();
// // fi.Name = i.LT_O_AyaFile.Display;
// // fi.Size = i.LT_AyaFile_Label_FileSize;
// // fi.Creator = i.LT_Common_Label_Creator.Display;
// // fi.Created = i.LT_Common_Label_Created.ToString();
// // ret.Add(fi);
// //save each file plus file info into their own folder by ayafile id this is because ayafiles can be dupe names and we need the wiki info to fixup the last created date etc
// var filePath = wikiOutputPath + Path.DirectorySeparatorChar + i.LT_O_AyaFile.Value.ToString();
// makeFolderIfNotExist(filePath);//output/objectype/client.f861ec01-8bde-46e1-9849-fcee9b42f05e/files/d5461ec01-8bde-46e1-9849-fcee9b42f0ff34/
// var af = AyaFile.GetItem(i.LT_O_AyaFile.Value);
// if (af == null) continue;
// af.WriteToDisk(filePath, af.Name);
// var fileInfo = new
// {
// name = i.LT_O_AyaFile.Display,
// created = i.LT_Common_Label_Created,
// creator = i.LT_Common_Label_Creator.Value,
// mimetype = af.mimeType,
// id = af.ID,
// size = af.FileSize,
// ayafiletype = af.FileType,
// rootobjectid = af.RootObjectID,
// rootobjecttype = af.RootObjectType
// };
// JsonSerializer serializer = new JsonSerializer();
// serializer.NullValueHandling = NullValueHandling.Include;
//#if(DEBUG)
// serializer.Formatting = Formatting.Indented;
//#endif
// JObject jo = JObject.FromObject(fileInfo, serializer);
// using (StreamWriter sw = new StreamWriter(filePath + Path.DirectorySeparatorChar + "meta.json"))
// using (JsonWriter writer = new JsonTextWriter(sw))
// {
// // serializer.Serialize(writer, o);
// serializer.Serialize(writer, jo);
// }
// }
if (!string.IsNullOrWhiteSpace(content))
return content;
@@ -781,9 +729,95 @@ namespace AyaNova.PlugIn.V8
return null;
}
private async System.Threading.Tasks.Task ExportAttachments(TypeAndID tid)
{
if (!WikiPage.HasWiki(tid.ID)) return;
WikiPage w = WikiPage.GetItem(tid);
AyaFileList fl = AyaFileList.GetList(w.ID);
if (fl.Count == 0) return;
//files
foreach (AyaFileList.AyaFileListInfo i in fl)
{
//WikiFileInfo fi = new WikiFileInfo();
// fi.Id = i.LT_O_AyaFile.Value.ToString();
// fi.Name = i.LT_O_AyaFile.Display;
// fi.Size = i.LT_AyaFile_Label_FileSize;
// fi.Creator = i.LT_Common_Label_Creator.Display;
// fi.Created = i.LT_Common_Label_Created.ToString();
// ret.Add(fi);
var af = AyaFile.GetItem(i.LT_O_AyaFile.Value);
if (af == null) continue;
//Upload
MultipartFormDataContent formDataContent = new MultipartFormDataContent();
//Form data like the bizobject type and id
formDataContent.Add(new StringContent(util.RootObjectToAyaType(tid.RootObjectType).ToString()), name: "AttachToObjectType");
formDataContent.Add(new StringContent(Map[tid.ID].ToString()), name: "AttachToObjectId");
//or if testing non-existant this is probably safe: long.MaxValue
StreamContent AttachmentFile = new StreamContent(af.GetContent());
AttachmentFile.Headers.ContentType = new MediaTypeHeaderValue(af.mimeType);
AttachmentFile.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
AttachmentFile.Headers.ContentDisposition.FileName = af.Name;
var sDate = i.LT_Common_Label_Created.ToString();
DateTime dtLastModified = DateTime.UtcNow;
if (sDate != null)
{
//parse out to UTC date
DateTime dt = new DateTime();
if (DateTime.TryParse(sDate, out dt))
{
dtLastModified = dt.ToUniversalTime();
}
}
AttachmentFile.Headers.ContentDisposition.ModificationDate = dtLastModified;
formDataContent.Add(AttachmentFile);
//create via inventory full test user as attachments use the role of the object attaching to
await util.PostFormDataAsync("Attachment", formDataContent);
//af.WriteToDisk(filePath, af.Name);
//var fileInfo = new
//{
// name = i.LT_O_AyaFile.Display,
// created = i.LT_Common_Label_Created,
// creator = i.LT_Common_Label_Creator.Value,
// mimetype = af.mimeType,
// id = af.ID,
// size = af.FileSize,
// ayafiletype = af.FileType,
// rootobjectid = af.RootObjectID,
// rootobjecttype = af.RootObjectType
//};
}
}
#endregion wiki
#region TAGS
private void Tagit(Guid g, List<string> tags)
{
@@ -808,7 +842,7 @@ namespace AyaNova.PlugIn.V8
#region OLD JSON EXPORT STUFF
@@ -837,7 +871,7 @@ namespace AyaNova.PlugIn.V8
//}
#endregion contract resolver
//private static string EnsureValidFileName(string fileName)
//{
// //make lower and replace spaces with dashes

View File

@@ -8,6 +8,8 @@ using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using System.Security.Cryptography;
using biz = GZTW.AyaNova.BLL;
namespace AyaNova.PlugIn.V8
@@ -159,6 +161,8 @@ namespace AyaNova.PlugIn.V8
return new ApiResponse() { HttpResponse = response, ObjectResponse = Parse(responseAsString) };
}
public async static Task<ApiResponse> PutAsync(string route, string putJson = null)
{
@@ -181,6 +185,24 @@ namespace AyaNova.PlugIn.V8
}
public async static Task<ApiResponse> PostFormDataAsync(string route, MultipartFormDataContent formContent)
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, route);
if (!string.IsNullOrWhiteSpace(JWT))
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", JWT);
requestMessage.Content = formContent;
HttpResponseMessage response = await client.SendAsync(requestMessage);
var responseAsString = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("POST FORMDATA error, route: " + route + "\n" + responseAsString + "\n" + response.ReasonPhrase);
}
else
return new ApiResponse() { HttpResponse = response, ObjectResponse = Parse(responseAsString) };
}
//eoc
public class ApiResponse
{
@@ -304,6 +326,45 @@ namespace AyaNova.PlugIn.V8
}
public static int RootObjectToAyaType(biz.RootObjectTypes rot)
{
switch (rot)
{
case biz.RootObjectTypes.User:
return (int)AyaType.User;
default:
throw new NotImplementedException("V8:util:RootObjectToAyaType -> type " + rot.ToString() + " is not coded yet");
}
}
public enum AyaType : int
{
NoType = 0,
Global = 1,
Widget = 2,//attachable, wikiable, reviewable
User = 3,//attachable, wikiable, reviewable
ServerState = 4,
License = 5,
LogFile = 6,
PickListTemplate = 7,
DEPRECATED_REUSELATER_08 = 8,
ServerJob = 9,
AyaNova7Import = 10,
TrialSeeder = 11,
Metrics = 12,
Translation = 13,
UserOptions = 14,
DEPRECATED_REUSELATER_15 = 15,
DEPRECATED_REUSELATER_16 = 16,
FileAttachment = 17,
DataListView = 18,
FormCustom = 19
}
#endregion
}//eoc