/// <summary> /// Validate the given SporeModel /// </summary> /// <param name="model"></param> /// <returns></returns> private bool ValidateSporeModel(SporeModel model) { try { SporeModel.Validate(model); return(true); } catch (Exception e) { _logger.LogError($"ValidateSporeModel: Failed To Validate SporeModel: {e}"); return(false); } }
/// <summary> /// Deserialize SporeModel to xml /// </summary> /// <param name="model"></param> /// <param name="xml"></param> /// <returns></returns> private bool DeserializeSporeModel(SporeModel model, out string xml) { try { xml = SporeModel.DeserializeToxml(model); return(true); } catch (Exception e) { xml = null; _logger.LogError($"DeserializeSporeModel: Failed To Deserialize SporeModel: {e}"); return(false); } }
/// <summary> /// Loads a SporeModel /// </summary> /// <param name="stream"></param> /// <returns></returns> private bool LoadSporeModel(Stream stream, out SporeModel model) { try { model = SporeModel.SerializeFromXml(stream); return(true); } catch (Exception e) { model = null; _logger.LogError($"LoadSporeModel: Failed To Serialize SporeModel: {e}"); return(false); } }
public async Task <bool> AddAsync(AssetUploadForm form, SporeServerAsset asset, SporeServerAsset parentAsset, bool slurped, SporeAssetType type) { try { var files = GetAssetFiles(form.AssetId); // load, validate & deserialize SporeModel SporeModel model = null; string modelXml = null; using (Stream modelStream = OpenFormFileStream(form.ModelData)) { if (!LoadSporeModel(modelStream, out model)) { throw new Exception("LoadSporeModel Failed"); } if (!ValidateSporeModel(model)) { throw new Exception("ValidateSporeModel Failed"); } if (!DeserializeSporeModel(model, out modelXml)) { throw new Exception("DeserializeSporeModel Failed"); } } // save files File.WriteAllText(files.ModelFile, modelXml); await SaveFormFile(form.ThumbnailData, files.ThumbFile); if (form.ImageData != null) { await SaveFormFile(form.ImageData, files.ImageFile); } if (form.ImageData_2 != null) { await SaveFormFile(form.ImageData_2, files.ImageFile2); } if (form.ImageData_3 != null) { await SaveFormFile(form.ImageData_3, files.ImageFile3); } if (form.ImageData_4 != null) { await SaveFormFile(form.ImageData_4, files.ImageFile4); } // update database asset.Used = true; asset.Timestamp = DateTime.Now; asset.OriginalAssetId = 0; asset.ParentAssetId = 0; if (parentAsset != null) { // when original asset id of parent is 0, // the parent id is the original asset id // else follow the original asset id specified if (parentAsset.OriginalAssetId == 0) { asset.OriginalAssetId = parentAsset.AssetId; } else { asset.OriginalAssetId = parentAsset.OriginalAssetId; } asset.ParentAssetId = parentAsset.AssetId; } asset.Name = form.ModelData.FileName; var tags = new List <SporeServerAssetTag>(); if (form.Tags != null) { foreach (string tagString in form.Tags.Split(",")) { string trimmedTagString = tagString.TrimStart().TrimEnd(); tags.Add(new SporeServerAssetTag() { Asset = asset, Tag = trimmedTagString }); } } asset.Tags = tags; var traits = new List <SporeServerAssetTrait>(); if (form.TraitGuids != null) { foreach (string traitString in form.TraitGuids.Split(",")) { string trimmedTraitString = traitString.TrimStart() .TrimStart('0', 'x') .TrimEnd(); Int64 traitType = Int64.Parse(trimmedTraitString, NumberStyles.HexNumber); // make sure the trait id is valid if (!Enum.IsDefined(typeof(SporeAssetTraitType), traitType)) { throw new Exception($"Invalid Trait Id: {traitType}"); } traits.Add(new SporeServerAssetTrait() { Asset = asset, TraitType = (SporeAssetTraitType)traitType }); } } asset.Traits = traits; asset.Description = form.Description; asset.Size = form.ThumbnailData.Length; asset.Slurped = slurped; // TODO, put this in a struct or whatever? asset.ModelFileUrl = GetRelativeUrlFromPath(files.ModelFile); asset.ThumbFileUrl = GetRelativeUrlFromPath(files.ThumbFile); asset.ImageFileUrl = GetRelativeUrlFromPath(files.ImageFile); asset.ImageFile2Url = GetRelativeUrlFromPath(files.ImageFile2); asset.ImageFile3Url = GetRelativeUrlFromPath(files.ImageFile3); asset.ImageFile4Url = GetRelativeUrlFromPath(files.ImageFile4); asset.ModelType = (SporeModelType)model.Properties.ModelType; asset.Type = type; _context.Assets.Update(asset); await _context.SaveChangesAsync(); _logger.LogInformation($"AddAsync: Added Asset {asset.AssetId}"); return(true); } catch (Exception e) { _logger.LogError($"AddAsync: Failed To Add Asset {asset.AssetId}: {e}"); return(false); } }