123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- using DataSharing.Repository;
- using DataSharing.SendTask;
- using Mapster;
- using MapsterMapper;
- using Microsoft.AspNetCore.Authentication.JwtBearer;
- using Microsoft.IdentityModel.Tokens;
- using Microsoft.OpenApi.Models;
- using Quartz;
- using Quartz.AspNetCore;
- using System.Text;
- using XF.Domain.Entities;
- using XF.Domain.Exceptions;
- using XF.Domain.Options;
- using XF.Domain.Repository;
- namespace DataSharing.Host
- {
- public static class StartupHelper
- {
- /// <summary>
- /// Authentication
- /// </summary>
- /// <param name="services"></param>
- /// <param name="configuration"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterAuthentication(this IServiceCollection services, ConfigurationManager configuration)
- {
- services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
- .AddJwtBearer(d =>
- {
- var jwtOptions = configuration.GetSection("IdentityConfiguration").Get<IdentityConfiguration>().Jwt;
- byte[] bytes = Encoding.UTF8.GetBytes(jwtOptions.SecretKey);
- var secKey = new SymmetricSecurityKey(bytes);
- d.TokenValidationParameters = new()
- {
- ValidateIssuer = false,
- ValidateAudience = false,
- ValidateLifetime = true,
- ValidateIssuerSigningKey = true,
- IssuerSigningKey = secKey,
- };
- //d.Audience = "hotline_api";
- })
- ;
- return services;
- }
- /// <summary>
- /// Swagger
- /// </summary>
- /// <param name="services"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterSwagger(this IServiceCollection services)
- {
- services.AddSwaggerGen(c =>
- {
- //添加文档
- c.SwaggerDoc("v1", new OpenApiInfo() { Title = "Hotline Api", Version = "v1.0", Description = "城市热线api" });
- var files = Directory.GetFiles(AppContext.BaseDirectory).Where(d => d.EndsWith(".xml"));
- foreach (var file in files)
- {
- c.IncludeXmlComments(file, true);
- }
- var scheme = new OpenApiSecurityScheme()
- {
- Description = "Authorization header. \r\nExample: 'Bearer ***'",
- Reference = new OpenApiReference
- {
- Type = ReferenceType.SecurityScheme,
- Id = "Authorization"
- },
- Scheme = "oauth2",
- Name = "Authorization",
- In = ParameterLocation.Header,
- Type = SecuritySchemeType.ApiKey,
- };
- c.AddSecurityDefinition("Authorization", scheme);
- var requirement = new OpenApiSecurityRequirement();
- requirement[scheme] = new List<string>();
- c.AddSecurityRequirement(requirement);
- });
- return services;
- }
- /// <summary>
- /// Cors
- /// </summary>
- /// <param name="services"></param>
- /// <param name="configuration"></param>
- /// <param name="corsOrigins"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterCors(this IServiceCollection services, ConfigurationManager configuration, string corsOrigins)
- {
- services.AddCors(options =>
- {
- options.AddPolicy(name: corsOrigins,
- builder =>
- {
- var origins = configuration.GetSection("Cors:Origins").Get<string[]>();
- builder.SetIsOriginAllowed(a =>
- {
- return origins.Any(origin => origin.StartsWith("*.", StringComparison.Ordinal)
- ? a.EndsWith(origin[1..], StringComparison.Ordinal)
- : a.Equals(origin, StringComparison.Ordinal));
- })
- .AllowAnyHeader()
- .AllowAnyMethod()
- .AllowCredentials();
- });
- });
- return services;
- }
- /// <summary>
- /// Mapper
- /// </summary>
- /// <param name="services"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterMapper(this IServiceCollection services)
- {
- var config = TypeAdapterConfig.GlobalSettings;
- config.ForDestinationType<IDataPermission>()
- .Ignore(d => d.CreatorId)
- .Ignore(d => d.CreatorOrgId)
- //.Ignore(d => d.CreatorOrgCode)
- .Ignore(d => d.AreaId);
- config.ForDestinationType<IWorkflow>()
- .Ignore(d => d.ExpiredTimeConfigId);
- config.ForDestinationType<IHasCreationTime>()
- .Ignore(d => d.CreationTime);
- config.ForDestinationType<IHasDeletionTime>().Ignore(d => d.DeletionTime);
- config.ForDestinationType<ISoftDelete>().Ignore(d => d.IsDeleted);
- config.ForDestinationType<IHasModificationTime>().Ignore(d => d.LastModificationTime);
- config.ForDestinationType<Entity>().Ignore(d => d.Id);
- services.AddSingleton(config);
- services.AddScoped<IMapper, ServiceMapper>();
- return services;
- }
- /// <summary>
- /// SignalR
- /// </summary>
- /// <param name="services"></param>
- /// <param name="configuration"></param>
- /// <returns></returns>
- public static IServiceCollection RegisterSignalR(this IServiceCollection services, ConfigurationManager configuration)
- {
- var connectionString = configuration.GetConnectionString("Redis");
- if (string.IsNullOrEmpty(connectionString))
- throw new UserFriendlyException("未配置signalR的redis连接");
- services.AddSignalR().AddStackExchangeRedis(connectionString, options =>
- {
- options.Configuration.ChannelPrefix = "Hotline:signalr:";
- });
- return services;
- }
- public static IServiceCollection RegisterRepository(this IServiceCollection services)
- {
- services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
- return services;
- }
- public static IServiceCollection RegisterJob(this IServiceCollection services)
- {
- services.AddQuartz(d =>
- {
- d.SchedulerId = "scheduler1";
- d.InterruptJobsOnShutdown = true;
- d.InterruptJobsOnShutdownWithWait = true;
- d.MaxBatchSize = 3;
- //load send task
- var taskLoadJobKey = new JobKey("task-load-job", "load task");
- d.AddJob<TaskLoadJob>(taskLoadJobKey);
- d.AddTrigger(t => t
- .WithIdentity("task-load-trigger")
- .ForJob(taskLoadJobKey)
- .StartNow()
- .WithCronSchedule("0 0/1 * * * ? ")
- );
- //execute send task
- var taskExecuteJobKey = new JobKey("task-execute-job", "send task");
- d.AddJob<TaskExecuteJob>(taskExecuteJobKey);
- d.AddTrigger(t => t
- .WithIdentity("task-execute-trigger")
- .ForJob(taskExecuteJobKey)
- .StartNow()
- .WithCronSchedule("0/1 * * * * ? ")
- );
- ////2小时定时拉取12315的办理过程
- //var taskCaseDistrecordJobKey = new JobKey("task-case-distrecord-job", "task case distrecord job");
- //d.AddJob<TaskCaseDistrecordJob>(taskCaseDistrecordJobKey);
- //d.AddTrigger(t => t
- // .WithIdentity("task-case-distrecord-job-trigger")
- // .ForJob(taskCaseDistrecordJobKey)
- // .StartNow()
- // .WithCronSchedule("0 0 */2 * * ?")//
- //);
- ////每天凌晨1点推送业务汇聚-统计数据
- //var taskSubmitCaseTotalJobKey = new JobKey("task-submit-case-total-job", "task submit case total job");
- //d.AddJob<TaskSubmitCaseTotalJob>(taskSubmitCaseTotalJobKey);
- //d.AddTrigger(t => t
- // .WithIdentity("task-submit-case-total-job-trigger")
- // .ForJob(taskSubmitCaseTotalJobKey)
- // .StartNow()
- // .WithCronSchedule("0 0 1 * * ?")//0 0 1 * * ?
- //);
- });
- ///
- services.AddQuartzServer(d =>
- {
- d.WaitForJobsToComplete = true;
- d.StartDelay = TimeSpan.FromSeconds(5);
- });
- return services;
- }
- }
- }
|