public async Task <IActionResult> DefineCover(string id, int?fotoId) { if (!String.IsNullOrEmpty(id) && fotoId != null) { var galeria = await _context.Galerias.Include(g => g.Fotografias).Where(g => g.ID.Equals(id)).FirstOrDefaultAsync(); // Caso a galeria exista if (galeria != null) { // Caso essa galeria tenha a fotografia em questão var foto = galeria.Fotografias.Where(f => f.ID == fotoId).FirstOrDefault(); if (foto != null) { galeria.FotoCapa = foto.ID; } } else { return(Json(new { success = false })); } try { _context.Update(galeria); await _context.SaveChangesAsync(); return(Json(new { success = true })); } catch (Exception e) { _email.NotifyError("Erro ao associar metadados à galeria.", "GaleriasController", "Edit - POST", e.Message); } } return(Json(new { success = false })); }
/// <summary> /// Upload do ficheiro para a Onedrive. /// </summary> /// <param name="filePath">Caminho do ficheiro no disco.</param> /// <param name="fileName">Nome do ficheiro.</param> /// <returns>Booleano que indica o sucesso do método.</returns> private async Task <UploadedPhotoModel> UploadFileAsync(string filePath, string fileName) { WebResponse result = null; ContaOnedrive conta = null; using (FileStream stream = File.OpenRead(filePath)) { long position = 0; long totalLength = stream.Length; int uploadFragmentSizeInMB = _appSettings.UploadFragmentSizeInMB; int length = uploadFragmentSizeInMB * 1024 * 1024; #region Encontrar conta e refrescar token // Encontrar a conta onedrive a ser utilizada para o upload conta = await GetAccountToUploadAsync(totalLength); // Se a conta retornar null, poderá ser porque já não existem contas com espaço if (conta == null) { return(new UploadedPhotoModel { Success = false, ErrorDescription = "Não foi possível adquirir uma conta com espaço suficiente." }); } await RefreshTokenAsync(conta, 2000); #endregion #region Criar sessão de upload string uploadUrl = await GetUploadSessionAsync(conta, fileName); if (uploadUrl == "Error") { // Não foi possível fazer a sessão de upload return(new UploadedPhotoModel { Success = false, ErrorDescription = "Não foi possível criar sessão de upload." }); } #endregion #region Upload do fragmento do ficheiro while (true) { byte[] bytes = await ReadFileFragmentAsync(stream, position, length); if (position >= totalLength) { break; } result = await UploadFileFragmentAsync(bytes, uploadUrl, position, totalLength, conta.AccessToken); position += bytes.Length; } #endregion #region Identificar as informações do ficheiro na onedrive if (result != null && conta != null) { string itemId = "", itemName = ""; using (Stream dataStream = result.GetResponseStream()) // Recolher a stream que contem o conteudo { try { StreamReader reader = new StreamReader(dataStream); // Abrir a stream string responseFromServer = reader.ReadToEnd(); // Ler o conteudo JObject content = JObject.Parse(responseFromServer); // Converter a resposta para um objeto json itemId = (string)content["id"]; // Recolher o id da imagem na onedrive itemName = (string)content["name"]; // Recolher o nome da imagem na onedrive } catch (Exception e) { _emailAPI.NotifyError("Erro ao recolher as informações do ficheiro que foi feito o upload.", "OnedriveAPI", "UploadFileAsync", e.Message); return(new UploadedPhotoModel { Success = false, ErrorDescription = "Não foi possível fazer upload do ficheiro." }); } if (!String.IsNullOrEmpty(itemId) && !String.IsNullOrEmpty(itemName)) { #region Atualizar o espaço da conta await UpdateDriveQuotaAsync(conta); #endregion return(new UploadedPhotoModel { ItemId = itemId, ItemName = itemName, Conta = conta, Success = true }); } } result.Close(); } #endregion } return(new UploadedPhotoModel { Success = false, ErrorDescription = "Não foi possível fazer upload do ficheiro." }); }
public async Task <IActionResult> Edit(string id, [Bind("ID,Nome,DataDeCriacao,IdentificacaoObra,Observacoes,HorasEstudio,HorasPosProducao,DataEntrega,Total,RequerenteFK")] Servico servico, IFormCollection form, string Tipos, string ServSolicitados) { string datasExecucao = form["DataExecucao"]; if (String.IsNullOrEmpty(id)) { return(NotFound()); } if (ModelState.IsValid) { try { #region Associar Tipos try { var tiposToRemove = await _context.Servicos_Tipos.Where(st => st.ServicoFK.Equals(servico.ID)).ToArrayAsync(); _context.RemoveRange(tiposToRemove); if (!String.IsNullOrEmpty(Tipos)) // Caso existam tipos a serem adicionados { var tiposToAdd = Tipos.Split(",").Select(t => new Servico_Tipo { ServicoFK = servico.ID, TipoFK = Int32.Parse(t) }).ToArray(); await _context.AddRangeAsync(tiposToAdd); } await _context.SaveChangesAsync(); } catch (Exception e) { _email.NotifyError("Erro ao associar tipos ao serviço.", "ServicosController", "Edit - POST", e.Message); } #endregion #region Associar ServSolic try { var servSolicToRemove = await _context.Servicos_ServicosSolicitados.Where(sst => sst.ServicoFK.Equals(servico.ID)).ToArrayAsync(); _context.RemoveRange(servSolicToRemove); if (!String.IsNullOrEmpty(ServSolicitados)) // Caso existam serviços solicitados a serem adicionados { var servSolicToAdd = ServSolicitados.Split(",").Select(ss => new Servico_ServicoSolicitado { ServicoFK = servico.ID, ServicoSolicitadoFK = Int32.Parse(ss) }).ToArray(); await _context.AddRangeAsync(servSolicToAdd); } await _context.SaveChangesAsync(); } catch (Exception e) { _email.NotifyError("Erro ao associar serviços solicitados ao serviço.", "ServicosController", "Edit - POST", e.Message); } #endregion #region TratamentoDatasExecucao try { var datasToRemove = _context.Servicos_DatasExecucao.Where(sd => sd.ServicoFK.Equals(servico.ID)).ToArray(); _context.RemoveRange(datasToRemove); if (!String.IsNullOrEmpty(datasExecucao)) { foreach (string dataStr in datasExecucao.Split(',')) { if (!String.IsNullOrEmpty(dataStr)) // Certificar que a string não está vazia { // Separar o ano, mes e dia string[] dataArray = dataStr.Split('-'); DataExecucao date = new DataExecucao { Data = new DateTime(Int32.Parse(dataArray[0]), Int32.Parse(dataArray[1]), Int32.Parse(dataArray[2])) }; // Criar nova data de execução _context.Add(date); await _context.SaveChangesAsync(); // Adicionar relação da nova data com o servico await _context.AddAsync(new Servico_DataExecucao { DataExecucaoFK = date.ID, ServicoFK = servico.ID }); await _context.SaveChangesAsync(); } } } } catch (Exception e) { _email.NotifyError("Erro ao adicionar datas de execução de um serviço.", "ServicosController", "Edit - POST", e.Message); } #endregion TratamentoDatasExecucao try { // Não deixar as horas ficarem null servico.HorasEstudio = servico.HorasEstudio ?? 0; servico.HorasPosProducao = servico.HorasPosProducao ?? 0; servico.Total = servico.Total ?? 0; // Adicionar paragrafos nas observações, caso existam if (!String.IsNullOrEmpty(servico.Observacoes)) { servico.Observacoes = servico.Observacoes.Replace("\r\n", "<br/>"); } _context.Update(servico); await _context.SaveChangesAsync(); } catch (Exception e) { await _logger.LogError( descricao : "Erro ao editar um serviço.", classe : "ServicosController", metodo : "Edit", erro : e.Message ); } } catch (DbUpdateConcurrencyException e) { if (!ServicosExists(servico.ID)) { return(NotFound()); } else { await _logger.LogError( descricao : "Erro ao editar um serviço.", classe : "ServicosController", metodo : "Edit", erro : e.Message ); } } TempData["Feedback"] = "Serviço editado com sucesso."; return(RedirectToAction(nameof(Details), new { id = servico.ID })); } // Lista da tabela intermediaria dos servico com os seus tipos var sevicos_tipos = await _context.Servicos_Tipos.Where(st => st.ServicoFK == id).ToListAsync(); // Lista da tabela intermediaria dos servico com os seus serviços solicitados var sevicosSolicitados = await _context.Servicos_ServicosSolicitados.Where(st => st.ServicoFK == id).ToListAsync(); return(View( new ServicosCreateViewModel { Servico = servico, RequerentesList = new SelectList(_context.Requerentes, "ID", "Nome", servico.RequerenteFK), TiposList = _context.Tipos.Select(t => new SelectListItem() { // Verificar se o tipo em que nos encontramos em cada instancia do select (select percorre todos), coincide com algum valor da lista servicos_tipos // Caso exista, retorna verdade Selected = (sevicos_tipos.Where(st => st.TipoFK == t.ID).Count() != 0), Text = t.Nome, Value = t.ID + "" }), ServSolicitados = _context.ServicosSolicitados.Select(s => new SelectListItem() { // Verificar se o tipo em que nos encontramos em cada instancia do select (select percorre todos), coincide com algum valor da lista servicos_servicosSolicitados // Caso exista, retorna verdade Selected = (sevicosSolicitados.Where(st => st.ServicoSolicitadoFK == s.ID).Count() != 0), Text = s.Nome, Value = s.ID + "" }) })); }