Skip to content

Commit fe73b78

Browse files
authored
feat: Scheduler SDK & SDK UnitTest (#102)
* feat: Scheduler SDK & SDK UnitTest * chore: sort global using * rename: remove meaningless repeat function name * resolve conversation * resolve conversation * chore: resolve merge error
1 parent 5ec1740 commit fe73b78

14 files changed

+771
-1
lines changed

Masa.Contrib.sln

+39
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BasicAbility", "BasicAbilit
302302
EndProject
303303
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.BuildingBlocks.BasicAbility.Scheduler", "src\BuildingBlocks\MASA.BuildingBlocks\src\BasicAbility\Masa.BuildingBlocks.BasicAbility.Scheduler\Masa.BuildingBlocks.BasicAbility.Scheduler.csproj", "{0EB0CB69-4C44-4462-A92A-A9B9FDA171DE}"
304304
EndProject
305+
306+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.BasicAbility.Scheduler.Tests", "test\Masa.Contrib.BasicAbility.Scheduler.Tests\Masa.Contrib.BasicAbility.Scheduler.Tests.csproj", "{5980D054-E2F3-4143-93D1-01993A955AE7}"
307+
EndProject
308+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Masa.Contrib.BasicAbility.Scheduler", "src\BasicAbility\Masa.Contrib.BasicAbility.Scheduler\Masa.Contrib.BasicAbility.Scheduler.csproj", "{8D84666E-C79E-4D49-B73D-360E62D312EF}"
309+
EndProject
305310
Global
306311
GlobalSection(SolutionConfigurationPlatforms) = preSolution
307312
Debug|Any CPU = Debug|Any CPU
@@ -1230,6 +1235,38 @@ Global
12301235
{789ABED5-7C94-4F6F-ADCA-E97F3DFC9479}.Release|Any CPU.Build.0 = Release|Any CPU
12311236
{789ABED5-7C94-4F6F-ADCA-E97F3DFC9479}.Release|x64.ActiveCfg = Release|Any CPU
12321237
{789ABED5-7C94-4F6F-ADCA-E97F3DFC9479}.Release|x64.Build.0 = Release|Any CPU
1238+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1239+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
1240+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Debug|x64.ActiveCfg = Debug|Any CPU
1241+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Debug|x64.Build.0 = Debug|Any CPU
1242+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
1243+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Release|Any CPU.Build.0 = Release|Any CPU
1244+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Release|x64.ActiveCfg = Release|Any CPU
1245+
{D91C3145-C31C-4301-A493-96F94C903CF2}.Release|x64.Build.0 = Release|Any CPU
1246+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1247+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Debug|Any CPU.Build.0 = Debug|Any CPU
1248+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Debug|x64.ActiveCfg = Debug|Any CPU
1249+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Debug|x64.Build.0 = Debug|Any CPU
1250+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Release|Any CPU.ActiveCfg = Release|Any CPU
1251+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Release|Any CPU.Build.0 = Release|Any CPU
1252+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Release|x64.ActiveCfg = Release|Any CPU
1253+
{FD35BEFA-512C-4483-B5C0-ADCA35680315}.Release|x64.Build.0 = Release|Any CPU
1254+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1255+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
1256+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Debug|x64.ActiveCfg = Debug|Any CPU
1257+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Debug|x64.Build.0 = Debug|Any CPU
1258+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
1259+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Release|Any CPU.Build.0 = Release|Any CPU
1260+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Release|x64.ActiveCfg = Release|Any CPU
1261+
{5980D054-E2F3-4143-93D1-01993A955AE7}.Release|x64.Build.0 = Release|Any CPU
1262+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1263+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
1264+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Debug|x64.ActiveCfg = Debug|Any CPU
1265+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Debug|x64.Build.0 = Debug|Any CPU
1266+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
1267+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Release|Any CPU.Build.0 = Release|Any CPU
1268+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Release|x64.ActiveCfg = Release|Any CPU
1269+
{8D84666E-C79E-4D49-B73D-360E62D312EF}.Release|x64.Build.0 = Release|Any CPU
12331270
{981E883E-CCDC-400B-8FB1-76E1E65C32AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
12341271
{981E883E-CCDC-400B-8FB1-76E1E65C32AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
12351272
{981E883E-CCDC-400B-8FB1-76E1E65C32AF}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1393,6 +1430,8 @@ Global
13931430
{FF3FD53D-D23E-48AC-98B6-3B028B4DE8AF} = {0D34A7F0-DC77-4789-A136-93089CBD15C3}
13941431
{83FA668F-C838-4883-996D-AF2ECF00FDF8} = {5DFAF4A2-ECB5-46E4-904D-1EA5F48B2D48}
13951432
{789ABED5-7C94-4F6F-ADCA-E97F3DFC9479} = {38E6C400-90C0-493E-9266-C1602E229F1B}
1433+
{5980D054-E2F3-4143-93D1-01993A955AE7} = {38E6C400-90C0-493E-9266-C1602E229F1B}
1434+
{8D84666E-C79E-4D49-B73D-360E62D312EF} = {5DFAF4A2-ECB5-46E4-904D-1EA5F48B2D48}
13961435
{981E883E-CCDC-400B-8FB1-76E1E65C32AF} = {0D34A7F0-DC77-4789-A136-93089CBD15C3}
13971436
{0D34A7F0-DC77-4789-A136-93089CBD15C3} = {DC578D74-98F0-4F19-A230-CFA8DAEE0AF1}
13981437
{0EB0CB69-4C44-4462-A92A-A9B9FDA171DE} = {0D34A7F0-DC77-4789-A136-93089CBD15C3}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.BasicAbility.Scheduler;
5+
6+
internal class Constants
7+
{
8+
internal const string DEFAULT_CLIENT_NAME = "masa.contrib.basicability.scheduler";
9+
internal const string ENVIRONMENT_KEY = "env_key";
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="Masa.Utils.Caller.HttpClient" Version="$(MasaUtilsPackageVersion)" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<ProjectReference Include="..\..\BuildingBlocks\MASA.BuildingBlocks\src\BasicAbility\Masa.BuildingBlocks.BasicAbility.Scheduler\Masa.BuildingBlocks.BasicAbility.Scheduler.csproj" />
15+
<ProjectReference Include="..\..\BuildingBlocks\MASA.BuildingBlocks\src\Identity\Masa.BuildingBlocks.Identity.IdentityModel\Masa.BuildingBlocks.Identity.IdentityModel.csproj" />
16+
</ItemGroup>
17+
18+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.BasicAbility.Scheduler;
5+
6+
public class SchedulerClient : ISchedulerClient
7+
{
8+
public ISchedulerJobService SchedulerJobService { get; }
9+
10+
public ISchedulerTaskService SchedulerTaskService { get; }
11+
12+
public SchedulerClient(ICallerProvider callerProvider, ILoggerFactory? loggerFactory = null)
13+
{
14+
SchedulerJobService = new SchedulerJobService(callerProvider, loggerFactory);
15+
SchedulerTaskService = new SchedulerTaskService(callerProvider, loggerFactory);
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Microsoft.Extensions.DependencyInjection;
5+
6+
public static class ServiceCollectionExtensions
7+
{
8+
public static IServiceCollection AddSchedulerClient(this IServiceCollection services, string schedulerServiceBaseAddress)
9+
{
10+
if (string.IsNullOrWhiteSpace(schedulerServiceBaseAddress))
11+
{
12+
throw new ArgumentNullException(nameof(schedulerServiceBaseAddress));
13+
}
14+
15+
services.AddSingleton<IRequestMessage, JsonRequestMessage>();
16+
return services.AddSchedulerClient(callerOptions =>
17+
{
18+
callerOptions.UseHttpClient(builder =>
19+
{
20+
builder.Name = DEFAULT_CLIENT_NAME;
21+
builder.Configure = opt => opt.BaseAddress = new Uri(schedulerServiceBaseAddress);
22+
});
23+
});
24+
}
25+
26+
public static IServiceCollection AddSchedulerClient(this IServiceCollection services, Action<CallerOptions> callerOptions)
27+
{
28+
ArgumentNullException.ThrowIfNull(callerOptions, nameof(callerOptions));
29+
30+
if (services.Any(service => service.ImplementationType == typeof(SchedulerProvider)))
31+
return services;
32+
33+
services.AddSingleton<SchedulerProvider>();
34+
services.AddHttpContextAccessor();
35+
services.AddCaller(callerOptions);
36+
37+
services.AddScoped<ISchedulerClient>(serviceProvider =>
38+
{
39+
var callProvider = serviceProvider.GetRequiredService<ICallerFactory>().CreateClient(DEFAULT_CLIENT_NAME);
40+
var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
41+
var schedulerClient = new SchedulerClient(callProvider, loggerFactory);
42+
return schedulerClient;
43+
});
44+
45+
return services;
46+
}
47+
48+
private class SchedulerProvider
49+
{
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.BasicAbility.Scheduler.Services;
5+
6+
public class SchedulerJobService : ISchedulerJobService
7+
{
8+
const string API = "/api/scheduler-job";
9+
10+
readonly ICallerProvider _callerProvider;
11+
readonly ILogger<SchedulerJobService>? _logger;
12+
13+
public SchedulerJobService(ICallerProvider callerProvider, ILoggerFactory? loggerFactory = null)
14+
{
15+
_callerProvider = callerProvider;
16+
_logger = loggerFactory?.CreateLogger<SchedulerJobService>();
17+
}
18+
19+
public async Task<Guid> AddbAsync(AddSchedulerJobRequest request)
20+
{
21+
if (string.IsNullOrWhiteSpace(request.ProjectIdentity))
22+
{
23+
throw new ArgumentNullException(nameof(request.ProjectIdentity));
24+
}
25+
26+
switch (request.JobType)
27+
{
28+
case BuildingBlocks.BasicAbility.Scheduler.Enum.JobTypes.JobApp:
29+
ArgumentNullException.ThrowIfNull(request.JobAppConfig, nameof(request.JobAppConfig));
30+
break;
31+
case BuildingBlocks.BasicAbility.Scheduler.Enum.JobTypes.Http:
32+
ArgumentNullException.ThrowIfNull(request.HttpConfig, nameof(request.HttpConfig));
33+
break;
34+
case BuildingBlocks.BasicAbility.Scheduler.Enum.JobTypes.DaprServiceInvocation:
35+
ArgumentNullException.ThrowIfNull(request.DaprServiceInvocationConfig, nameof(request.DaprServiceInvocationConfig));
36+
break;
37+
}
38+
39+
try
40+
{
41+
var requestUri = $"{API}/addSchedulerJobBySdk";
42+
return await _callerProvider.PostAsync<AddSchedulerJobRequest, Guid>(requestUri, request);
43+
}
44+
catch (Exception ex)
45+
{
46+
_logger?.LogError(ex, "AddSchedulerJobAsync Error");
47+
return Guid.Empty;
48+
}
49+
50+
}
51+
52+
public async Task<bool> DisableAsync(BaseSchedulerJobRequest request)
53+
{
54+
try
55+
{
56+
var requestData = new ChangeEnabledStatusRequest()
57+
{
58+
JobId = request.JobId,
59+
OperatorId = request.OperatorId,
60+
Enabled = false
61+
};
62+
var requestUri = $"{API}/changeEnableStatus";
63+
await _callerProvider.PutAsync<ChangeEnabledStatusRequest>(requestUri, requestData);
64+
return true;
65+
}
66+
catch (Exception ex)
67+
{
68+
_logger?.LogError(ex, "DisableSchedulerJob Error");
69+
return false;
70+
}
71+
}
72+
73+
public async Task<bool> EnableAsync(BaseSchedulerJobRequest request)
74+
{
75+
try
76+
{
77+
var requestData = new ChangeEnabledStatusRequest()
78+
{
79+
JobId = request.JobId,
80+
OperatorId = request.OperatorId,
81+
Enabled = true
82+
};
83+
var requestUri = $"{API}/changeEnableStatus";
84+
await _callerProvider.PutAsync<ChangeEnabledStatusRequest>(requestUri, requestData);
85+
return true;
86+
}
87+
catch (Exception ex)
88+
{
89+
_logger?.LogError(ex, "EnableSchedulerJob Error");
90+
return false;
91+
}
92+
}
93+
94+
public async Task<bool> RemoveAsync(BaseSchedulerJobRequest request)
95+
{
96+
try
97+
{
98+
var requestUri = $"{API}";
99+
await _callerProvider.DeleteAsync(requestUri, request);
100+
return true;
101+
}
102+
catch (Exception ex)
103+
{
104+
_logger?.LogError(ex, "RemoveSchedulerJobAsync Error");
105+
return false;
106+
}
107+
}
108+
109+
public async Task<bool> StartAsync(BaseSchedulerJobRequest request)
110+
{
111+
try
112+
{
113+
var requestUri = $"{API}/startJob";
114+
await _callerProvider.PutAsync(requestUri, request);
115+
return true;
116+
}
117+
catch (Exception ex)
118+
{
119+
_logger?.LogError(ex, "StartSchedulerJobAsync Error");
120+
return false;
121+
}
122+
}
123+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.BasicAbility.Scheduler.Services;
5+
6+
public class SchedulerTaskService : ISchedulerTaskService
7+
{
8+
const string API = "/api/scheduler-task";
9+
10+
readonly ICallerProvider _callerProvider;
11+
readonly ILogger<SchedulerTaskService>? _logger;
12+
13+
public SchedulerTaskService(ICallerProvider callerProvider, ILoggerFactory? loggerFactory)
14+
{
15+
_callerProvider = callerProvider;
16+
_logger = loggerFactory?.CreateLogger<SchedulerTaskService>();
17+
}
18+
19+
public async Task<bool> StopAsync(BaseSchedulerTaskRequest request)
20+
{
21+
try
22+
{
23+
var requestUri = $"{API}/stop";
24+
await _callerProvider.PutAsync(requestUri, request);
25+
return true;
26+
}
27+
catch (Exception ex)
28+
{
29+
_logger?.LogError(ex, "StopSchedulerTaskAsync Error");
30+
return false;
31+
}
32+
}
33+
34+
public async Task<bool> StartAsync(BaseSchedulerTaskRequest request)
35+
{
36+
try
37+
{
38+
var requestData = new StartSchedulerTaskRequest()
39+
{
40+
TaskId = request.TaskId,
41+
OperatorId = request.OperatorId,
42+
IsManual = true
43+
};
44+
45+
var requestUri = $"{API}/start";
46+
await _callerProvider.PutAsync(requestUri, requestData);
47+
return true;
48+
}
49+
catch (Exception ex)
50+
{
51+
_logger?.LogError(ex, "StopSchedulerTaskAsync Error");
52+
return false;
53+
}
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
global using Masa.BuildingBlocks.BasicAbility.Scheduler;
5+
global using Masa.BuildingBlocks.BasicAbility.Scheduler.Request;
6+
global using Masa.BuildingBlocks.BasicAbility.Scheduler.Service;
7+
global using Masa.BuildingBlocks.Identity.IdentityModel;
8+
global using Masa.Contrib.BasicAbility.Scheduler;
9+
global using Masa.Contrib.BasicAbility.Scheduler.Services;
10+
global using Masa.Utils.Caller.Core;
11+
global using Masa.Utils.Caller.HttpClient;
12+
global using Microsoft.Extensions.Logging;
13+
global using static Masa.Contrib.BasicAbility.Scheduler.Constants;
Submodule MASA.BuildingBlocks updated 22 files
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
<Nullable>enable</Nullable>
6+
7+
<IsPackable>false</IsPackable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftTeskSdkPackageVersion)" />
12+
<PackageReference Include="Moq" Version="$(MoqPackageVersion)" />
13+
<PackageReference Include="MSTest.TestAdapter" Version="$(MSTestPackageVersion)" />
14+
<PackageReference Include="MSTest.TestFramework" Version="$(MSTestPackageVersion)" />
15+
<PackageReference Include="coverlet.collector" Version="$(CoverletPackageVersion)">
16+
<PrivateAssets>all</PrivateAssets>
17+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
18+
</PackageReference>
19+
</ItemGroup>
20+
21+
<ItemGroup>
22+
<ProjectReference Include="..\..\src\BasicAbility\Masa.Contrib.BasicAbility.Scheduler\Masa.Contrib.BasicAbility.Scheduler.csproj" />
23+
<ProjectReference Include="..\..\src\BuildingBlocks\MASA.BuildingBlocks\src\BasicAbility\Masa.BuildingBlocks.BasicAbility.Scheduler\Masa.BuildingBlocks.BasicAbility.Scheduler.csproj" />
24+
</ItemGroup>
25+
26+
</Project>

0 commit comments

Comments
 (0)