StartupHelper.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using DataSharing.Repository;
  2. using DataSharing.SendTask;
  3. using Mapster;
  4. using MapsterMapper;
  5. using Microsoft.AspNetCore.Authentication.JwtBearer;
  6. using Microsoft.IdentityModel.Tokens;
  7. using Microsoft.OpenApi.Models;
  8. using Quartz;
  9. using Quartz.AspNetCore;
  10. using System.Text;
  11. using XF.Domain.Entities;
  12. using XF.Domain.Exceptions;
  13. using XF.Domain.Options;
  14. using XF.Domain.Repository;
  15. namespace DataSharing.Host
  16. {
  17. public static class StartupHelper
  18. {
  19. /// <summary>
  20. /// Authentication
  21. /// </summary>
  22. /// <param name="services"></param>
  23. /// <param name="configuration"></param>
  24. /// <returns></returns>
  25. public static IServiceCollection RegisterAuthentication(this IServiceCollection services, ConfigurationManager configuration)
  26. {
  27. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  28. .AddJwtBearer(d =>
  29. {
  30. var jwtOptions = configuration.GetSection("IdentityConfiguration").Get<IdentityConfiguration>().Jwt;
  31. byte[] bytes = Encoding.UTF8.GetBytes(jwtOptions.SecretKey);
  32. var secKey = new SymmetricSecurityKey(bytes);
  33. d.TokenValidationParameters = new()
  34. {
  35. ValidateIssuer = false,
  36. ValidateAudience = false,
  37. ValidateLifetime = true,
  38. ValidateIssuerSigningKey = true,
  39. IssuerSigningKey = secKey,
  40. };
  41. //d.Audience = "hotline_api";
  42. })
  43. ;
  44. return services;
  45. }
  46. /// <summary>
  47. /// Swagger
  48. /// </summary>
  49. /// <param name="services"></param>
  50. /// <returns></returns>
  51. public static IServiceCollection RegisterSwagger(this IServiceCollection services)
  52. {
  53. services.AddSwaggerGen(c =>
  54. {
  55. //添加文档
  56. c.SwaggerDoc("v1", new OpenApiInfo() { Title = "Hotline Api", Version = "v1.0", Description = "城市热线api" });
  57. var files = Directory.GetFiles(AppContext.BaseDirectory).Where(d => d.EndsWith(".xml"));
  58. foreach (var file in files)
  59. {
  60. c.IncludeXmlComments(file, true);
  61. }
  62. var scheme = new OpenApiSecurityScheme()
  63. {
  64. Description = "Authorization header. \r\nExample: 'Bearer ***'",
  65. Reference = new OpenApiReference
  66. {
  67. Type = ReferenceType.SecurityScheme,
  68. Id = "Authorization"
  69. },
  70. Scheme = "oauth2",
  71. Name = "Authorization",
  72. In = ParameterLocation.Header,
  73. Type = SecuritySchemeType.ApiKey,
  74. };
  75. c.AddSecurityDefinition("Authorization", scheme);
  76. var requirement = new OpenApiSecurityRequirement();
  77. requirement[scheme] = new List<string>();
  78. c.AddSecurityRequirement(requirement);
  79. });
  80. return services;
  81. }
  82. /// <summary>
  83. /// Cors
  84. /// </summary>
  85. /// <param name="services"></param>
  86. /// <param name="configuration"></param>
  87. /// <param name="corsOrigins"></param>
  88. /// <returns></returns>
  89. public static IServiceCollection RegisterCors(this IServiceCollection services, ConfigurationManager configuration, string corsOrigins)
  90. {
  91. services.AddCors(options =>
  92. {
  93. options.AddPolicy(name: corsOrigins,
  94. builder =>
  95. {
  96. var origins = configuration.GetSection("Cors:Origins").Get<string[]>();
  97. builder.SetIsOriginAllowed(a =>
  98. {
  99. return origins.Any(origin => origin.StartsWith("*.", StringComparison.Ordinal)
  100. ? a.EndsWith(origin[1..], StringComparison.Ordinal)
  101. : a.Equals(origin, StringComparison.Ordinal));
  102. })
  103. .AllowAnyHeader()
  104. .AllowAnyMethod()
  105. .AllowCredentials();
  106. });
  107. });
  108. return services;
  109. }
  110. /// <summary>
  111. /// Mapper
  112. /// </summary>
  113. /// <param name="services"></param>
  114. /// <returns></returns>
  115. public static IServiceCollection RegisterMapper(this IServiceCollection services)
  116. {
  117. var config = TypeAdapterConfig.GlobalSettings;
  118. config.ForDestinationType<IDataPermission>()
  119. .Ignore(d => d.CreatorId)
  120. .Ignore(d => d.CreatorOrgId)
  121. //.Ignore(d => d.CreatorOrgCode)
  122. .Ignore(d => d.AreaId);
  123. config.ForDestinationType<IWorkflow>()
  124. .Ignore(d => d.ExpiredTimeConfigId);
  125. config.ForDestinationType<IHasCreationTime>()
  126. .Ignore(d => d.CreationTime);
  127. config.ForDestinationType<IHasDeletionTime>().Ignore(d => d.DeletionTime);
  128. config.ForDestinationType<ISoftDelete>().Ignore(d => d.IsDeleted);
  129. config.ForDestinationType<IHasModificationTime>().Ignore(d => d.LastModificationTime);
  130. config.ForDestinationType<Entity>().Ignore(d => d.Id);
  131. services.AddSingleton(config);
  132. services.AddScoped<IMapper, ServiceMapper>();
  133. return services;
  134. }
  135. /// <summary>
  136. /// SignalR
  137. /// </summary>
  138. /// <param name="services"></param>
  139. /// <param name="configuration"></param>
  140. /// <returns></returns>
  141. public static IServiceCollection RegisterSignalR(this IServiceCollection services, ConfigurationManager configuration)
  142. {
  143. var connectionString = configuration.GetConnectionString("Redis");
  144. if (string.IsNullOrEmpty(connectionString))
  145. throw new UserFriendlyException("未配置signalR的redis连接");
  146. services.AddSignalR().AddStackExchangeRedis(connectionString, options =>
  147. {
  148. options.Configuration.ChannelPrefix = "Hotline:signalr:";
  149. });
  150. return services;
  151. }
  152. public static IServiceCollection RegisterRepository(this IServiceCollection services)
  153. {
  154. services.AddScoped(typeof(IRepository<>), typeof(BaseRepository<>));
  155. return services;
  156. }
  157. public static IServiceCollection RegisterJob(this IServiceCollection services)
  158. {
  159. services.AddQuartz(d =>
  160. {
  161. d.SchedulerId = "scheduler1";
  162. d.InterruptJobsOnShutdown = true;
  163. d.InterruptJobsOnShutdownWithWait = true;
  164. d.MaxBatchSize = 3;
  165. //load send task
  166. var taskLoadJobKey = new JobKey("task-load-job", "load task");
  167. d.AddJob<TaskLoadJob>(taskLoadJobKey);
  168. d.AddTrigger(t => t
  169. .WithIdentity("task-load-trigger")
  170. .ForJob(taskLoadJobKey)
  171. .StartNow()
  172. .WithCronSchedule("0 0/1 * * * ? ")
  173. );
  174. //execute send task
  175. var taskExecuteJobKey = new JobKey("task-execute-job", "send task");
  176. d.AddJob<TaskExecuteJob>(taskExecuteJobKey);
  177. d.AddTrigger(t => t
  178. .WithIdentity("task-execute-trigger")
  179. .ForJob(taskExecuteJobKey)
  180. .StartNow()
  181. .WithCronSchedule("0/1 * * * * ? ")
  182. );
  183. ////2小时定时拉取12315的办理过程
  184. //var taskCaseDistrecordJobKey = new JobKey("task-case-distrecord-job", "task case distrecord job");
  185. //d.AddJob<TaskCaseDistrecordJob>(taskCaseDistrecordJobKey);
  186. //d.AddTrigger(t => t
  187. // .WithIdentity("task-case-distrecord-job-trigger")
  188. // .ForJob(taskCaseDistrecordJobKey)
  189. // .StartNow()
  190. // .WithCronSchedule("0 0 */2 * * ?")//
  191. //);
  192. ////每天凌晨1点推送业务汇聚-统计数据
  193. //var taskSubmitCaseTotalJobKey = new JobKey("task-submit-case-total-job", "task submit case total job");
  194. //d.AddJob<TaskSubmitCaseTotalJob>(taskSubmitCaseTotalJobKey);
  195. //d.AddTrigger(t => t
  196. // .WithIdentity("task-submit-case-total-job-trigger")
  197. // .ForJob(taskSubmitCaseTotalJobKey)
  198. // .StartNow()
  199. // .WithCronSchedule("0 0 1 * * ?")//0 0 1 * * ?
  200. //);
  201. });
  202. ///
  203. services.AddQuartzServer(d =>
  204. {
  205. d.WaitForJobsToComplete = true;
  206. d.StartDelay = TimeSpan.FromSeconds(5);
  207. });
  208. return services;
  209. }
  210. }
  211. }