├── .gitattributes
├── .gitignore
├── Calamus.TaskScheduler.sln
├── Calamus.TaskScheduler
├── .config
│ └── dotnet-tools.json
├── Calamus.TaskScheduler.csproj
├── Controllers
│ └── HomeController.cs
├── Dockerfile
├── Infrastructure
│ ├── ClearNLogJob.cs
│ ├── CodeResult.cs
│ ├── DateTimeConverter.cs
│ ├── Dtos
│ │ ├── EmailConfigRequest.cs
│ │ ├── EmailNoticeModel.cs
│ │ ├── JobCreateOrUpdateRequest.cs
│ │ ├── JobResponse.cs
│ │ ├── JobSearchRequest.cs
│ │ ├── PropertyConfigurationModel.cs
│ │ └── RequestBase.cs
│ ├── EnumExtensions.cs
│ ├── Enums.cs
│ ├── Filters
│ │ ├── GatewayResultFilterAttribute.cs
│ │ ├── GlobalExeceptionFilterAttribute.cs
│ │ └── ModelValidatorFilterAttribute.cs
│ ├── HttpJob.cs
│ ├── IDistributedCacheExtensions.cs
│ ├── IocEngine.cs
│ ├── JobDataMapExtensions.cs
│ ├── Keys.cs
│ ├── Listeners.cs
│ ├── NLogHostService.cs
│ └── WhereIfExtensions.cs
├── Program.cs
├── Properties
│ └── launchSettings.json
├── Startup.cs
├── Views
│ ├── Home
│ │ ├── CreateOrUpdate.cshtml
│ │ ├── Index.cshtml
│ │ ├── Info.cshtml
│ │ ├── Log.cshtml
│ │ └── Notice.cshtml
│ ├── Shared
│ │ ├── _Layout.cshtml
│ │ └── _Layout_Layer.cshtml
│ ├── _ViewImports.cshtml
│ └── _ViewStart.cshtml
├── appsettings.Development.json
├── appsettings.json
├── database
│ ├── schema_20_to_22_upgrade.sql
│ ├── schema_25_to_26_upgrade.sql
│ ├── schema_26_to_30.sql
│ ├── sqlserver_schema_10_to_20_upgrade.sql
│ └── tables
│ │ ├── tables_firebird.sql
│ │ ├── tables_mysql_innodb.sql
│ │ ├── tables_oracle.sql
│ │ ├── tables_postgres.sql
│ │ ├── tables_sqlServer.sql
│ │ ├── tables_sqlServerMOT.sql
│ │ └── tables_sqlite.sql
├── nlog.config
├── start.sh
└── wwwroot
│ ├── adminlte3
│ ├── dist
│ │ ├── css
│ │ │ ├── adminlte.css
│ │ │ ├── adminlte.css.map
│ │ │ ├── adminlte.min.css
│ │ │ ├── adminlte.min.css.map
│ │ │ └── alt
│ │ │ │ ├── adminlte.components.css
│ │ │ │ ├── adminlte.components.css.map
│ │ │ │ ├── adminlte.components.min.css
│ │ │ │ ├── adminlte.components.min.css.map
│ │ │ │ ├── adminlte.core.css
│ │ │ │ ├── adminlte.core.css.map
│ │ │ │ ├── adminlte.core.min.css
│ │ │ │ ├── adminlte.core.min.css.map
│ │ │ │ ├── adminlte.extra-components.css
│ │ │ │ ├── adminlte.extra-components.css.map
│ │ │ │ ├── adminlte.extra-components.min.css
│ │ │ │ ├── adminlte.extra-components.min.css.map
│ │ │ │ ├── adminlte.pages.css
│ │ │ │ ├── adminlte.pages.css.map
│ │ │ │ ├── adminlte.pages.min.css
│ │ │ │ ├── adminlte.pages.min.css.map
│ │ │ │ ├── adminlte.plugins.css
│ │ │ │ ├── adminlte.plugins.css.map
│ │ │ │ ├── adminlte.plugins.min.css
│ │ │ │ └── adminlte.plugins.min.css.map
│ │ └── js
│ │ │ ├── .eslintrc.json
│ │ │ ├── adminlte.js
│ │ │ ├── adminlte.js.map
│ │ │ ├── adminlte.min.js
│ │ │ ├── adminlte.min.js.map
│ │ │ ├── demo.js
│ │ │ └── pages
│ │ │ ├── dashboard.js
│ │ │ ├── dashboard2.js
│ │ │ └── dashboard3.js
│ └── plugins
│ │ ├── bootstrap
│ │ └── js
│ │ │ ├── bootstrap.bundle.js
│ │ │ ├── bootstrap.bundle.js.map
│ │ │ ├── bootstrap.bundle.min.js
│ │ │ ├── bootstrap.bundle.min.js.map
│ │ │ ├── bootstrap.js
│ │ │ ├── bootstrap.js.map
│ │ │ ├── bootstrap.min.js
│ │ │ └── bootstrap.min.js.map
│ │ ├── fontawesome-free
│ │ ├── css
│ │ │ ├── all.css
│ │ │ ├── all.min.css
│ │ │ ├── brands.css
│ │ │ ├── brands.min.css
│ │ │ ├── fontawesome.css
│ │ │ ├── fontawesome.min.css
│ │ │ ├── regular.css
│ │ │ ├── regular.min.css
│ │ │ ├── solid.css
│ │ │ ├── solid.min.css
│ │ │ ├── svg-with-js.css
│ │ │ ├── svg-with-js.min.css
│ │ │ ├── v4-shims.css
│ │ │ └── v4-shims.min.css
│ │ └── webfonts
│ │ │ ├── fa-brands-400.eot
│ │ │ ├── fa-brands-400.svg
│ │ │ ├── fa-brands-400.ttf
│ │ │ ├── fa-brands-400.woff
│ │ │ ├── fa-brands-400.woff2
│ │ │ ├── fa-regular-400.eot
│ │ │ ├── fa-regular-400.svg
│ │ │ ├── fa-regular-400.ttf
│ │ │ ├── fa-regular-400.woff
│ │ │ ├── fa-regular-400.woff2
│ │ │ ├── fa-solid-900.eot
│ │ │ ├── fa-solid-900.svg
│ │ │ ├── fa-solid-900.ttf
│ │ │ ├── fa-solid-900.woff
│ │ │ └── fa-solid-900.woff2
│ │ ├── jquery
│ │ ├── jquery.js
│ │ ├── jquery.min.js
│ │ ├── jquery.min.map
│ │ ├── jquery.slim.js
│ │ ├── jquery.slim.min.js
│ │ └── jquery.slim.min.map
│ │ ├── moment
│ │ ├── locale
│ │ │ ├── af.js
│ │ │ ├── ar-dz.js
│ │ │ ├── ar-kw.js
│ │ │ ├── ar-ly.js
│ │ │ ├── ar-ma.js
│ │ │ ├── ar-sa.js
│ │ │ ├── ar-tn.js
│ │ │ ├── ar.js
│ │ │ ├── az.js
│ │ │ ├── be.js
│ │ │ ├── bg.js
│ │ │ ├── bm.js
│ │ │ ├── bn-bd.js
│ │ │ ├── bn.js
│ │ │ ├── bo.js
│ │ │ ├── br.js
│ │ │ ├── bs.js
│ │ │ ├── ca.js
│ │ │ ├── cs.js
│ │ │ ├── cv.js
│ │ │ ├── cy.js
│ │ │ ├── da.js
│ │ │ ├── de-at.js
│ │ │ ├── de-ch.js
│ │ │ ├── de.js
│ │ │ ├── dv.js
│ │ │ ├── el.js
│ │ │ ├── en-SG.js
│ │ │ ├── en-au.js
│ │ │ ├── en-ca.js
│ │ │ ├── en-gb.js
│ │ │ ├── en-ie.js
│ │ │ ├── en-il.js
│ │ │ ├── en-in.js
│ │ │ ├── en-nz.js
│ │ │ ├── eo.js
│ │ │ ├── es-do.js
│ │ │ ├── es-mx.js
│ │ │ ├── es-us.js
│ │ │ ├── es.js
│ │ │ ├── et.js
│ │ │ ├── eu.js
│ │ │ ├── fa.js
│ │ │ ├── fi.js
│ │ │ ├── fil.js
│ │ │ ├── fo.js
│ │ │ ├── fr-ca.js
│ │ │ ├── fr-ch.js
│ │ │ ├── fr.js
│ │ │ ├── fy.js
│ │ │ ├── ga.js
│ │ │ ├── gd.js
│ │ │ ├── gl.js
│ │ │ ├── gom-deva.js
│ │ │ ├── gom-latn.js
│ │ │ ├── gu.js
│ │ │ ├── he.js
│ │ │ ├── hi.js
│ │ │ ├── hr.js
│ │ │ ├── hu.js
│ │ │ ├── hy-am.js
│ │ │ ├── id.js
│ │ │ ├── is.js
│ │ │ ├── it-ch.js
│ │ │ ├── it.js
│ │ │ ├── ja.js
│ │ │ ├── jv.js
│ │ │ ├── ka.js
│ │ │ ├── kk.js
│ │ │ ├── km.js
│ │ │ ├── kn.js
│ │ │ ├── ko.js
│ │ │ ├── ku.js
│ │ │ ├── ky.js
│ │ │ ├── lb.js
│ │ │ ├── lo.js
│ │ │ ├── lt.js
│ │ │ ├── lv.js
│ │ │ ├── me.js
│ │ │ ├── mi.js
│ │ │ ├── mk.js
│ │ │ ├── ml.js
│ │ │ ├── mn.js
│ │ │ ├── mr.js
│ │ │ ├── ms-my.js
│ │ │ ├── ms.js
│ │ │ ├── mt.js
│ │ │ ├── my.js
│ │ │ ├── nb.js
│ │ │ ├── ne.js
│ │ │ ├── nl-be.js
│ │ │ ├── nl.js
│ │ │ ├── nn.js
│ │ │ ├── oc-lnc.js
│ │ │ ├── pa-in.js
│ │ │ ├── pl.js
│ │ │ ├── pt-br.js
│ │ │ ├── pt.js
│ │ │ ├── ro.js
│ │ │ ├── ru.js
│ │ │ ├── sd.js
│ │ │ ├── se.js
│ │ │ ├── si.js
│ │ │ ├── sk.js
│ │ │ ├── sl.js
│ │ │ ├── sq.js
│ │ │ ├── sr-cyrl.js
│ │ │ ├── sr.js
│ │ │ ├── ss.js
│ │ │ ├── sv.js
│ │ │ ├── sw.js
│ │ │ ├── ta.js
│ │ │ ├── te.js
│ │ │ ├── tet.js
│ │ │ ├── tg.js
│ │ │ ├── th.js
│ │ │ ├── tk.js
│ │ │ ├── tl-ph.js
│ │ │ ├── tlh.js
│ │ │ ├── tr.js
│ │ │ ├── tzl.js
│ │ │ ├── tzm-latn.js
│ │ │ ├── tzm.js
│ │ │ ├── ug-cn.js
│ │ │ ├── uk.js
│ │ │ ├── ur.js
│ │ │ ├── uz-latn.js
│ │ │ ├── uz.js
│ │ │ ├── vi.js
│ │ │ ├── x-pseudo.js
│ │ │ ├── yo.js
│ │ │ ├── zh-cn.js
│ │ │ ├── zh-hk.js
│ │ │ ├── zh-mo.js
│ │ │ └── zh-tw.js
│ │ ├── locales.js
│ │ ├── locales.min.js
│ │ ├── locales.min.js.map
│ │ ├── moment-with-locales.js
│ │ ├── moment-with-locales.min.js
│ │ ├── moment-with-locales.min.js.map
│ │ ├── moment.min.js
│ │ └── moment.min.js.map
│ │ ├── overlayScrollbars
│ │ ├── css
│ │ │ ├── OverlayScrollbars.css
│ │ │ └── OverlayScrollbars.min.css
│ │ └── js
│ │ │ ├── OverlayScrollbars.js
│ │ │ ├── OverlayScrollbars.min.js
│ │ │ ├── jquery.overlayScrollbars.js
│ │ │ └── jquery.overlayScrollbars.min.js
│ │ └── tempusdominus-bootstrap-4
│ │ ├── css
│ │ ├── tempusdominus-bootstrap-4.css
│ │ └── tempusdominus-bootstrap-4.min.css
│ │ └── js
│ │ ├── tempusdominus-bootstrap-4.js
│ │ └── tempusdominus-bootstrap-4.min.js
│ ├── favicon.ico
│ ├── jquery.form.js
│ ├── kendoui2017
│ ├── js
│ │ ├── angular.min.js
│ │ ├── cultures
│ │ │ ├── kendo.culture.zh-CHS.min.js
│ │ │ ├── kendo.culture.zh-CHS.min.js.map
│ │ │ ├── kendo.culture.zh-CHT.min.js
│ │ │ ├── kendo.culture.zh-CHT.min.js.map
│ │ │ ├── kendo.culture.zh-CN.min.js
│ │ │ ├── kendo.culture.zh-CN.min.js.map
│ │ │ ├── kendo.culture.zh-HK.min.js
│ │ │ ├── kendo.culture.zh-HK.min.js.map
│ │ │ ├── kendo.culture.zh-Hans.min.js
│ │ │ ├── kendo.culture.zh-Hans.min.js.map
│ │ │ ├── kendo.culture.zh-Hant.min.js
│ │ │ ├── kendo.culture.zh-Hant.min.js.map
│ │ │ ├── kendo.culture.zh-MO.min.js
│ │ │ ├── kendo.culture.zh-MO.min.js.map
│ │ │ ├── kendo.culture.zh-SG.min.js
│ │ │ ├── kendo.culture.zh-SG.min.js.map
│ │ │ ├── kendo.culture.zh-TW.min.js
│ │ │ ├── kendo.culture.zh-TW.min.js.map
│ │ │ ├── kendo.culture.zh.min.js
│ │ │ └── kendo.culture.zh.min.js.map
│ │ ├── jquery.min.js
│ │ ├── jquery.min.map
│ │ ├── jszip.min.js
│ │ ├── kendo.all.min.js
│ │ ├── kendo.all.min.js.map
│ │ ├── kendo.core.min.js
│ │ ├── kendo.core.min.js.map
│ │ ├── kendo.web.min.js
│ │ ├── kendo.web.min.js.map
│ │ └── messages
│ │ │ ├── kendo.messages.zh-CN.min.js
│ │ │ ├── kendo.messages.zh-CN.min.js.map
│ │ │ ├── kendo.messages.zh-HK.min.js
│ │ │ ├── kendo.messages.zh-HK.min.js.map
│ │ │ ├── kendo.messages.zh-TW.min.js
│ │ │ └── kendo.messages.zh-TW.min.js.map
│ └── styles
│ │ ├── Bootstrap
│ │ ├── editor.png
│ │ ├── imagebrowser.png
│ │ ├── indeterminate.gif
│ │ ├── loading-image.gif
│ │ ├── loading.gif
│ │ ├── loading_2x.gif
│ │ ├── markers.png
│ │ ├── markers_2x.png
│ │ ├── slider-h.gif
│ │ ├── slider-v.gif
│ │ ├── sprite.png
│ │ ├── sprite_2x.png
│ │ ├── sprite_kpi.png
│ │ └── sprite_kpi_2x.png
│ │ ├── Default
│ │ ├── editor.png
│ │ ├── imagebrowser.png
│ │ ├── indeterminate.gif
│ │ ├── loading-image.gif
│ │ ├── loading.gif
│ │ ├── loading_2x.gif
│ │ ├── markers.png
│ │ ├── markers_2x.png
│ │ ├── slider-h.gif
│ │ ├── slider-v.gif
│ │ ├── sprite.png
│ │ ├── sprite_2x.png
│ │ ├── sprite_kpi.png
│ │ └── sprite_kpi_2x.png
│ │ ├── fonts
│ │ ├── DejaVu
│ │ │ ├── DejaVuSans-Bold.ttf
│ │ │ ├── DejaVuSans-BoldOblique.ttf
│ │ │ ├── DejaVuSans-ExtraLight.ttf
│ │ │ ├── DejaVuSans-Oblique.ttf
│ │ │ ├── DejaVuSans.ttf
│ │ │ ├── DejaVuSansMono-Bold.ttf
│ │ │ ├── DejaVuSansMono-BoldOblique.ttf
│ │ │ ├── DejaVuSansMono-Oblique.ttf
│ │ │ ├── DejaVuSansMono.ttf
│ │ │ ├── DejaVuSerif-Bold.ttf
│ │ │ ├── DejaVuSerif-BoldItalic.ttf
│ │ │ ├── DejaVuSerif-Italic.ttf
│ │ │ ├── DejaVuSerif.ttf
│ │ │ └── LICENSE.txt
│ │ └── glyphs
│ │ │ ├── KendoUIGlyphs.eot
│ │ │ ├── KendoUIGlyphs.svg
│ │ │ ├── KendoUIGlyphs.ttf
│ │ │ ├── KendoUIGlyphs.woff
│ │ │ ├── WebComponentsIcons.eot
│ │ │ ├── WebComponentsIcons.svg
│ │ │ ├── WebComponentsIcons.ttf
│ │ │ └── WebComponentsIcons.woff
│ │ ├── images
│ │ ├── back.png
│ │ ├── kendoui.svg
│ │ ├── kendoui.ttf
│ │ ├── kendoui.woff
│ │ ├── wp8_icons.png
│ │ └── wp8_inverseicons.png
│ │ ├── kendo.bootstrap-v4.min.css
│ │ ├── kendo.bootstrap-v4.min.css.map
│ │ ├── kendo.bootstrap.min.css
│ │ ├── kendo.bootstrap.min.css.map
│ │ ├── kendo.bootstrap.mobile.min.css
│ │ ├── kendo.bootstrap.mobile.min.css.map
│ │ ├── kendo.common.core.min.css
│ │ ├── kendo.common.core.min.css.map
│ │ ├── kendo.common.min.css
│ │ ├── kendo.common.min.css.map
│ │ ├── kendo.default-v2.min.css
│ │ ├── kendo.default-v2.min.css.map
│ │ ├── kendo.default.min.css
│ │ ├── kendo.default.min.css.map
│ │ ├── kendo.default.mobile.min.css
│ │ ├── kendo.default.mobile.min.css.map
│ │ ├── kendo.rtl.min.css
│ │ ├── kendo.rtl.min.css.map
│ │ └── textures
│ │ ├── brushed-metal.png
│ │ ├── dots1.png
│ │ ├── dots10.png
│ │ ├── dots11.png
│ │ ├── dots12.png
│ │ ├── dots13.png
│ │ ├── dots2.png
│ │ ├── dots3.png
│ │ ├── dots4.png
│ │ ├── dots5.png
│ │ ├── dots6.png
│ │ ├── dots7.png
│ │ ├── dots8.png
│ │ ├── dots9.png
│ │ ├── glass-lighter.png
│ │ ├── glass.png
│ │ ├── highlight.png
│ │ ├── hsv-gradient.png
│ │ ├── hue.png
│ │ ├── leather1.png
│ │ ├── leather2.png
│ │ ├── noise.png
│ │ ├── stripe1.png
│ │ ├── stripe2.png
│ │ ├── stripe3.png
│ │ ├── stripe4.png
│ │ ├── stripe5.png
│ │ ├── stripe6.png
│ │ ├── transparency.png
│ │ └── transtexture.png
│ ├── laydate
│ ├── laydate.js
│ └── theme
│ │ └── default
│ │ ├── font
│ │ ├── iconfont.eot
│ │ ├── iconfont.svg
│ │ ├── iconfont.ttf
│ │ └── iconfont.woff
│ │ └── laydate.css
│ └── layer
│ ├── layer.js
│ ├── mobile
│ ├── layer.js
│ └── need
│ │ └── layer.css
│ └── theme
│ └── default
│ ├── icon-ext.png
│ ├── icon.png
│ ├── layer.css
│ ├── loading-0.gif
│ ├── loading-1.gif
│ └── loading-2.gif
└── README.md
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 | *.js linguist-language=csharp
38 | *.css linguist-language=csharp
39 | *.html linguist-language=csharp
40 | ###############################################################################
41 | # behavior for image files
42 | #
43 | # image files are treated as binary by default.
44 | ###############################################################################
45 | #*.jpg binary
46 | #*.png binary
47 | #*.gif binary
48 |
49 | ###############################################################################
50 | # diff behavior for common document formats
51 | #
52 | # Convert binary document formats to text before diffing them. This feature
53 | # is only available from the command line. Turn it on by uncommenting the
54 | # entries below.
55 | ###############################################################################
56 | #*.doc diff=astextplain
57 | #*.DOC diff=astextplain
58 | #*.docx diff=astextplain
59 | #*.DOCX diff=astextplain
60 | #*.dot diff=astextplain
61 | #*.DOT diff=astextplain
62 | #*.pdf diff=astextplain
63 | #*.PDF diff=astextplain
64 | #*.rtf diff=astextplain
65 | #*.RTF diff=astextplain
66 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.30717.126
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Calamus.TaskScheduler", "Calamus.TaskScheduler\Calamus.TaskScheduler.csproj", "{DDECC6BF-9803-404C-B055-D393711B4BB6}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {DDECC6BF-9803-404C-B055-D393711B4BB6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {DDECC6BF-9803-404C-B055-D393711B4BB6}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {DDECC6BF-9803-404C-B055-D393711B4BB6}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {DDECC6BF-9803-404C-B055-D393711B4BB6}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {FA0E7422-542D-4824-8C06-1BE00D1E38F5}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/.config/dotnet-tools.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 1,
3 | "isRoot": true,
4 | "tools": {
5 | "dotnet-ef": {
6 | "version": "5.0.2",
7 | "commands": [
8 | "dotnet-ef"
9 | ]
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Calamus.TaskScheduler.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | net5.0
5 | d88b30f5-c595-43c1-a9df-df08aeed7de4
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | Always
22 |
23 |
24 | Always
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 | Always
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim
2 | COPY . /quartznet
3 | WORKDIR quartznet
4 | # 时区设置
5 | RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
6 | RUN echo 'Asia/Shanghai' >/etc/timezone
7 | EXPOSE 80
8 | ENTRYPOINT ["dotnet","Calamus.TaskScheduler.dll"]
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/ClearNLogJob.cs:
--------------------------------------------------------------------------------
1 | using Quartz;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.IO;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 |
8 | namespace Calamus.TaskScheduler.Infrastructure
9 | {
10 | ///
11 | /// 每3天清空 NLog 产生的日志文件
12 | ///
13 | public class ClearNLogJob : IJob
14 | {
15 | public Task Execute(IJobExecutionContext context)
16 | {
17 | string path = Path.Combine(AppContext.BaseDirectory, "logs");
18 | if (Directory.Exists(path))
19 | {
20 | Directory.Delete(path, true);
21 | }
22 |
23 | return Task.CompletedTask;
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/CodeResult.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 |
6 | namespace Calamus.TaskScheduler.Infrastructure
7 | {
8 | public class CodeResult
9 | {
10 | public int Code { get; set; }
11 | public string Msg { get; set; }
12 | public static CodeResult Success
13 | {
14 | get
15 | {
16 | return new CodeResult
17 | {
18 | Code = 0,
19 | Msg = "success"
20 | };
21 | }
22 | }
23 | public static CodeResult Failed
24 | {
25 | get
26 | {
27 | return new CodeResult
28 | {
29 | Code = -1,
30 | Msg = "failed"
31 | };
32 | }
33 | }
34 | }
35 |
36 | public class CodeResult : CodeResult
37 | {
38 | public T Data { get; set; }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/DateTimeConverter.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Text.Json;
5 | using System.Text.Json.Serialization;
6 | using System.Threading.Tasks;
7 |
8 | namespace Calamus.TaskScheduler.Infrastructure
9 | {
10 | ///
11 | /// JSON 序列化日期格式转换
12 | ///
13 | public class DateTimeConverter : JsonConverter
14 | {
15 | public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
16 | {
17 | if (reader.TokenType == JsonTokenType.String)
18 | {
19 | if (DateTime.TryParse(reader.GetString(), out DateTime date))
20 | return date;
21 | }
22 | return reader.GetDateTime();
23 | }
24 |
25 | public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
26 | {
27 | writer.WriteStringValue(value.ToString("yyyy-MM-dd HH:mm:ss"));
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Dtos/EmailConfigRequest.cs:
--------------------------------------------------------------------------------
1 | using FluentValidation;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Threading.Tasks;
6 |
7 | namespace Calamus.TaskScheduler.Infrastructure.Dtos
8 | {
9 | public class EmailConfigRequest
10 | {
11 | public string Host { get; set; }
12 | public int Port { get; set; }
13 | public string UserName { get; set; }
14 | public string Password { get; set; }
15 | public string To { get; set; }
16 | public string NickName { get; set; }
17 | ///
18 | /// 单位:分,通过缓存控制,多少分内只通知一次
19 | ///
20 | public int CacheExpiry { get; set; }
21 | }
22 |
23 | public class EmailNoticeCreateValidator : AbstractValidator
24 | {
25 | public EmailNoticeCreateValidator()
26 | {
27 | RuleFor(model => model.Host).NotEmpty();
28 | RuleFor(model => model.Port).GreaterThan(0);
29 | RuleFor(model => model.UserName).NotEmpty();
30 | RuleFor(model => model.Password).NotEmpty();
31 | RuleFor(model => model.To).NotEmpty();
32 | RuleFor(model => model.NickName).NotEmpty();
33 | RuleFor(model => model.CacheExpiry).GreaterThan(0);
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Dtos/EmailNoticeModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 |
6 | namespace Calamus.TaskScheduler.Infrastructure.Dtos
7 | {
8 | public class EmailNoticeModel
9 | {
10 | public DateTime ErrorTime { get; set; }
11 | public string Message { get; set; }
12 | public string StackTrace { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Dtos/JobSearchRequest.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc.Rendering;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Linq;
5 | using System.Threading.Tasks;
6 |
7 | namespace Calamus.TaskScheduler.Infrastructure.Dtos
8 | {
9 | public class JobSearchRequest: RequestBase
10 | {
11 | public JobSearchRequest()
12 | {
13 |
14 | }
15 | public string Name { get; set; }
16 | public string Group { get; set; }
17 |
18 |
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Dtos/PropertyConfigurationModel.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Linq;
4 | using System.Threading.Tasks;
5 |
6 | namespace Calamus.TaskScheduler.Infrastructure.Dtos
7 | {
8 | public class PropertyConfigurationModel
9 | {
10 | public string Name { get; set; }
11 | public string Value { get; set; }
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Dtos/RequestBase.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc.Rendering;
2 | using System.Collections.Generic;
3 |
4 | namespace Calamus.TaskScheduler.Infrastructure.Dtos
5 | {
6 | public abstract class RequestBase
7 | {
8 | public RequestBase()
9 | {
10 | Properties = new Dictionary>();
11 | }
12 | public IDictionary> Properties { get; set; }
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Enums.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.ComponentModel;
4 | using System.Linq;
5 | using System.Threading.Tasks;
6 |
7 | namespace Calamus.TaskScheduler.Infrastructure
8 | {
9 | public enum HttpMethodEnum
10 | {
11 | [Description("GET")]
12 | Get = 1,
13 | [Description("POST")]
14 | Post = 2
15 | }
16 |
17 | public enum TriggerTypeEnum
18 | {
19 | [Description("Simple")]
20 | Simple = 1,
21 | [Description("Cron")]
22 | Cron = 2
23 | }
24 | public enum IntervalTypeEnum
25 | {
26 | [Description("秒")]
27 | Second = 1,
28 | [Description("分")]
29 | Minute = 2,
30 | [Description("时")]
31 | Hour = 3,
32 | [Description("天")]
33 | Day = 4
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Calamus.TaskScheduler/Infrastructure/Filters/GatewayResultFilterAttribute.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.AspNetCore.Mvc;
2 | using Microsoft.AspNetCore.Mvc.Filters;
3 | using System;
4 | using System.Collections.Generic;
5 | using System.Linq;
6 | using System.Threading.Tasks;
7 |
8 | namespace Calamus.TaskScheduler.Infrastructure.Filters
9 | {
10 | public class GatewayResultFilterAttribute : IResultFilter
11 | {
12 | public void OnResultExecuted(ResultExecutedContext context)
13 | {
14 | }
15 |
16 | public void OnResultExecuting(ResultExecutingContext context)
17 | {
18 | if (context.Result is EmptyResult)
19 | {
20 | context.Result = new JsonResult(CodeResult.Success);
21 | }
22 | else if (context.Result is ContentResult)
23 | {
24 | }
25 | else if (context.Result is ObjectResult temp)
26 | {
27 | if ((temp.Value as CodeResult) != null)
28 | {
29 | return;
30 | }
31 | context.Result = new JsonResult(new CodeResult