Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Versão para avaliação do time Minuto Seguros #56

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
bin/
obj/
.vs/
43 changes: 25 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,37 @@
Oportunidade de trabalho na Minuto Seguros
Técnicas/Linguagem utilizada:
===========================================
> AspNetCore 2.1, C#
> SOLID
> Repository Pattern
> IoC

Venha trabalhar na área de tecnologia da Minuto Corretora de Seguros. Utilizamos métodos ágeis para criação de software e nosso clima é de extrema colaboração.

Se você tem interesse em fazer parte de uma equipe multidisciplinar e que adora criar software com qualidade, siga os seguintes passos:

Faça um fork desse projeto e faça um pull request com a resolução do seguinte problema:
Documentação:
===========================================
> Swagger

Exercício de programação: As principais palavras
-------------------------------------------------------
Executando a aplicação
===========================================
A aplicação trata-se de um web api RESTFULL

Você deverá criar um programa para obter automaticamente o conteúdo dos dez últimos tópicos publicados no blog da Minuto Seguros. Abaixo segue um link para auxiliá-lo nesse trabalho:
URL APIs: http://localhost:5000/swagger

http://www.minutoseguros.com.br/blog/feed/

Caso tenha problemas em obter o feed, deixamos um arquivo feed.xml aqui no repositório.
Chamada via CURL
===========================================
curl http://localhost:5000/api/v1/feeds/topics

O seu programa deverá avaliar quais as dez principais palavras abordadas nesses tópicos e qual o número de vezes que elas aparecem. Também deverá exibir a quantidade de palavras por tópico. Além disso, deverão ser removidos os artigos e preposições nessa análise.

A linguagem que mais utilizamos é C#. Porém, você poderá realizar o exercício na linguagem de programação de sua preferência.
EXTRA: Banco de dados Mongo
===========================================
Ao consumir o serviço Baixar Feeds, um "espelho" do registros é criado em uma base de dados mongo. O objetivo é mostrar de forma simples como a aplicação escalaria de foma simples, caso fosse necessário manter uma base de dados local para outras análises.

Como trabalhamos aqui
----------
Credenciais do banco de dados:
mongodb://msdbuser:ms#2018@ds135592.mlab.com:35592/minutosegurodb

Trabalhamos com uma boa infraestrutura, nosso hardware é muito bom e possuímos um ambiente de trabalho muito agradável. A empresa não possui hierarquias desnecessárias e você é convidado e desafiado a colaborar com todas as frentes de trabalho. Ou seja, aqui o “pitaco” é bem vindo!

Nós acreditamos muito nos números para tomada de decisões. Nós possuímos diversas métricas e isso inclui também medir o nosso código. Acompanhamos esses indicadores para construir códigos sólidos e de fácil manutenção. Afinal, queremos a cada dia mais flexibilidade e continuar animados a evoluir nossas aplicações.
Fontes para algumas informações:
===========================================
https://www.normaculta.com.br/artigo-indefinido/
https://www.normaculta.com.br/artigo-definido/
https://www.normaculta.com.br/preposicao/

Nosso trabalho é baseado em autogestão. Só existe uma regra de convivência na frente de TI: É proibido murmurar! Aqui as opiniões são discutidas, resolvidas e sempre chegamos a um consenso para melhorar a nossa convivência. Isso não foi descrito por um gerente de RH e sim por um desenvolvedor de software!
Binary file added src/.vs/Minuto.Seguros/v15/.suo
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1,003 changes: 1,003 additions & 0 deletions src/.vs/config/applicationhost.config

Large diffs are not rendered by default.

81 changes: 81 additions & 0 deletions src/Minuto.Seguros.Application/Controllers/FeedsController.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using System;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Minuto.Seguros.Service.Contracts;

namespace Minuto.Seguros.Application.Controllers.V1
{
/// <summary>
/// Gestão de feeds
/// </summary>
[Authorize]
[ApiVersion("1")]
[Route("api/v1/feeds")]
[Produces("application/json")]
public class FeedsController : ControllerBase
{
private readonly IFeedService _feedService;

/// <summary>
/// Construtor
/// </summary>
/// <param name="feedService"></param>
public FeedsController(
IFeedService feedService
)
{
_feedService = feedService;
}

/// <summary>
/// Baixar Feeds
/// </summary>
[AllowAnonymous]
[HttpGet]
[ProducesResponseType(201)]
[ProducesResponseType(400)]
public IActionResult BaixarFeeds()
{
try
{
return new ObjectResult(_feedService.GetAllFeeds());
}
catch (ArgumentNullException ex)
{
return NotFound(ex);
}
catch (Exception ex)
{
return BadRequest(ex);
}
}

/// <summary>
/// Contabilizar TOP 10 palavras por Tópico
/// </summary>
/// <example>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...</example>
/// <returns>Mensagem de confirmação de sucesso ou erro.</returns>
/// <response code="200">String com o token gerado</response>
[AllowAnonymous]
[HttpGet]
[Route("topics")]
[ProducesResponseType(201)]
[ProducesResponseType(400)]
public IActionResult SincronizarFeeds()
{
try
{
var result = _feedService.GetFeeds();
return new ObjectResult(result);
}
catch (ArgumentNullException ex)
{
return NotFound(ex);
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Versioning;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Minuto.Seguros.Application.Extensions.swagger
{
/// <summary>
/// Extensão para recuperar nome da api Swagger
/// </summary>
public static class ActionDescriptorExtensions
{
/// <summary>
/// Retora versão da api
/// </summary>
/// <param name="actionDescriptor"></param>
/// <returns></returns>
public static ApiVersionModel GetApiVersion(this ActionDescriptor actionDescriptor)
{
return actionDescriptor?.Properties
.Where((kvp) => ((Type)kvp.Key).Equals(typeof(ApiVersionModel)))
.Select(kvp => kvp.Value as ApiVersionModel).FirstOrDefault();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
using Minuto.Seguros.Application.Extensions.swagger;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Minuto.Seguros.Application.Filters.swagger
{
/// <summary>
/// Filtro de api swagger
/// </summary>
public class ApiVersionOperationFilter : IOperationFilter
{
/// <summary>
/// Executa filtro de acordo com a versão
/// </summary>
/// <param name="operation"></param>
/// <param name="context"></param>
public void Apply(Operation operation, OperationFilterContext context)
{
var actionApiVersionModel = context.ApiDescription.ActionDescriptor?.GetApiVersion();
if (actionApiVersionModel == null)
{
return;
}

if (actionApiVersionModel.DeclaredApiVersions.Any())
{
operation.Produces = operation.Produces
.SelectMany(p => actionApiVersionModel.DeclaredApiVersions
.Select(version => $"{p};v={version.ToString()}")).ToList();
}
else
{
operation.Produces = operation.Produces
.SelectMany(p => actionApiVersionModel.ImplementedApiVersions.OrderByDescending(v => v)
.Select(version => $"{p};v={version.ToString()}")).ToList();
}
}
}
}
30 changes: 30 additions & 0 deletions src/Minuto.Seguros.Application/Filters/swagger/VersionFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Minuto.Seguros.Application.Filters.swagger
{
/// <summary>
/// Filtro de versão swagger
/// </summary>
///
public class VersionFilter: IDocumentFilter
{
/// <summary>
/// Aplica o filtro de acordo com a versão
/// </summary>
/// <param name="swaggerDoc"></param>
/// <param name="context"></param>
public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
{
swaggerDoc.Paths = swaggerDoc.Paths
.ToDictionary(
path => path.Key.Replace("v{version}", swaggerDoc.Info.Version),
path => path.Value
);
}
}
}
51 changes: 51 additions & 0 deletions src/Minuto.Seguros.Application/Minuto.Seguros.Application.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>bin\Debug\netcoreapp2.1\Minuto.Seguro.Application.xml</DocumentationFile>
</PropertyGroup>

<ItemGroup>
<None Remove="Resources\Swagger_Minuto_Seguros_index.html" />
</ItemGroup>

<ItemGroup>
<EmbeddedResource Include="Resources\Swagger_Minuto_Seguros_index.html" />
</ItemGroup>

<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="4.8.1" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.3.1" />
<PackageReference Include="AutoMapper" Version="8.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="3.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="3.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="3.0.0" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\Minuto.Seguros.Infra.Client.Corporate.Rss\Minuto.Seguros.Infra.Client.Corporate.Rss.csproj" />
<ProjectReference Include="..\Minuto.Seguros.Infra.CrossCutting\Minuto.Seguros.Infra.CrossCutting.csproj" />
<ProjectReference Include="..\Minuto.Seguros.Infra.Data\Minuto.Seguros.Infra.Data.csproj" />
<ProjectReference Include="..\Minuto.Seguros.Service\Minuto.Seguros.Service.csproj" />
</ItemGroup>

<ItemGroup>
<None Update="Minuto.Seguros.Application.xml">
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
</None>
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Controller_SelectedScaffolderID>ApiControllerWithActionsScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Controller</Controller_SelectedScaffolderCategoryPath>
<WebStackScaffolding_ControllerDialogWidth>600</WebStackScaffolding_ControllerDialogWidth>
<WebStackScaffolding_IsLayoutPageSelected>True</WebStackScaffolding_IsLayoutPageSelected>
<WebStackScaffolding_IsPartialViewSelected>False</WebStackScaffolding_IsPartialViewSelected>
<WebStackScaffolding_IsReferencingScriptLibrariesSelected>True</WebStackScaffolding_IsReferencingScriptLibrariesSelected>
<WebStackScaffolding_LayoutPageFile />
<WebStackScaffolding_IsAsyncSelected>False</WebStackScaffolding_IsAsyncSelected>
<ActiveDebugProfile>Minuto.Seguro.Application</ActiveDebugProfile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>
20 changes: 20 additions & 0 deletions src/Minuto.Seguros.Application/Minuto.Seguros.Application.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

24 changes: 24 additions & 0 deletions src/Minuto.Seguros.Application/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;

namespace Minuto.Seguros.Application
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
31 changes: 31 additions & 0 deletions src/Minuto.Seguros.Application/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"launchUrl": "swagger",
"iisExpress": {
"applicationUrl": "http://localhost:5000",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Minuto.Seguro.Application": {
"commandName": "Project",
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Loading