Exemple #1
0
        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 }));
        }
Exemple #2
0
        /// <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 + ""
                })
            }));
        }