From 1c3226c2608e5d1e351af3b8131f6ffcf3e8a289 Mon Sep 17 00:00:00 2001
From: "tgstation-server-ci[bot]"
<161980869+tgstation-server-ci[bot]@users.noreply.github.com>
Date: Sun, 4 Aug 2024 15:15:03 +0000
Subject: [PATCH] Deploy code docs to GitHub Pages for workflow run 2972
Commit: 89b103afbb2b6067f1b5437582ed1adfee0b8b16
---
_advanced_watchdog_8cs_source.html | 2 +-
_application_8cs_source.html | 2 +-
_basic_watchdog_8cs_source.html | 2 +-
_chat_controller_8cs_source.html | 646 +++++-----
_database_context_8cs_source.html | 748 +++++------
_database_seeder_8cs_source.html | 518 ++++----
_i_database_context_8cs_source.html | 62 +-
_instance_controller_8cs_source.html | 1027 +++++++--------
_instance_factory_8cs_source.html | 2 +-
..._permission_set_controller_8cs_source.html | 378 +++---
_port_allocator_8cs_source.html | 4 +-
_session_persistor_8cs_source.html | 470 ++++---
...r_8_common_8_assembly_info_8cs_source.html | 2 +-
...r_8_shared_8_assembly_info_8cs_source.html | 2 +-
_user_group_controller_8cs_source.html | 336 +++--
_watchdog_base_8cs_source.html | 4 +-
changelog.yml | 7 +-
...erver_1_1_api_1_1_default_credentials.html | 4 +-
...rver_1_1_api_1_1_models_1_1_entity_id.html | 2 +-
...erver_1_1_api_1_1_models_1_1_instance.html | 4 +-
...ls_1_1_internal_1_1_chat_bot_api_base.html | 4 +-
...ls_1_1_internal_1_1_chat_bot_settings.html | 6 +-
...ls_1_1_internal_1_1_chat_channel_base.html | 2 +-
..._internal_1_1_server_information_base.html | 2 +-
..._models_1_1_internal_1_1_swarm_server.html | 2 +-
..._1_models_1_1_internal_1_1_user_group.html | 2 +-
...r_1_1_api_1_1_models_1_1_named_entity.html | 2 +-
...1_1_api_1_1_models_1_1_permission_set.html | 6 +-
...t_1_1_components_1_1_instance_factory.html | 2 +-
...nts_1_1_session_1_1_session_persistor.html | 328 ++---
...ts_1_1_watchdog_1_1_advanced_watchdog.html | 2 +-
...nents_1_1_watchdog_1_1_basic_watchdog.html | 2 +-
...onents_1_1_watchdog_1_1_watchdog_base.html | 6 +-
...figuration_1_1_database_configuration.html | 6 +-
...nfiguration_1_1_general_configuration.html | 2 +-
...st_1_1_controllers_1_1_api_controller.html | 6 +-
...t_1_1_controllers_1_1_chat_controller.html | 536 ++++----
..._1_1_component_interfacing_controller.html | 6 +-
...1_controllers_1_1_instance_controller.html | 993 ++++++++-------
..._1_instance_permission_set_controller.html | 252 ++--
...controllers_1_1_user_group_controller.html | 230 ++--
...ver_1_1_host_1_1_core_1_1_application.html | 2 +-
...database_1_1_database_context-members.html | 8 +-
...ost_1_1_database_1_1_database_context.html | 904 +++++++------
...base_1_1_database_context__coll__graph.map | 40 +-
...base_1_1_database_context__coll__graph.md5 | 2 +-
...base_1_1_database_context__coll__graph.png | Bin 199865 -> 221430 bytes
...host_1_1_database_1_1_database_seeder.html | 496 ++++----
...e_1_1_my_sql_database_context-members.html | 4 +
..._database_1_1_my_sql_database_context.html | 54 +-
...1_my_sql_database_context__coll__graph.map | 42 +-
...1_my_sql_database_context__coll__graph.md5 | 2 +-
...1_my_sql_database_context__coll__graph.png | Bin 196588 -> 223232 bytes
...postgres_sql_database_context-members.html | 4 +
...ase_1_1_postgres_sql_database_context.html | 54 +-
...gres_sql_database_context__coll__graph.map | 42 +-
...gres_sql_database_context__coll__graph.md5 | 2 +-
...gres_sql_database_context__coll__graph.png | Bin 196697 -> 223345 bytes
...1_sql_server_database_context-members.html | 12 +-
...abase_1_1_sql_server_database_context.html | 56 +-
...l_server_database_context__coll__graph.map | 42 +-
...l_server_database_context__coll__graph.md5 | 2 +-
...l_server_database_context__coll__graph.png | Bin 196429 -> 223149 bytes
...e_1_1_sqlite_database_context-members.html | 4 +
..._database_1_1_sqlite_database_context.html | 56 +-
...1_sqlite_database_context__coll__graph.map | 44 +-
...1_sqlite_database_context__coll__graph.md5 | 2 +-
...1_sqlite_database_context__coll__graph.png | Bin 195200 -> 221253 bytes
...rver_1_1_host_1_1_models_1_1_chat_bot.html | 2 +-
..._1_server_1_1_host_1_1_models_1_1_job.html | 2 +-
...1_server_1_1_host_1_1_models_1_1_user.html | 4 +-
...1_security_1_1_authentication_context.html | 6 +-
...1_1_host_1_1_utils_1_1_port_allocator.html | 6 +-
functions.html | 6 +-
functions_c.html | 2 +-
functions_f.html | 2 +-
functions_g.html | 4 +-
functions_h.html | 3 +-
functions_i.html | 4 +-
functions_j.html | 4 +-
functions_n.html | 3 +-
functions_o.html | 2 +-
functions_p.html | 4 +-
functions_prop_r.html | 4 +-
functions_prop_t.html | 2 +-
functions_r.html | 9 +-
functions_s.html | 7 +-
functions_t.html | 10 +-
functions_vars_r.html | 1 +
functions_vars_t.html | 1 +
hierarchy.html | 1130 +++++++++--------
inherit_graph_124.map | 2 +-
inherit_graph_124.md5 | 2 +-
inherit_graph_124.png | Bin 5503 -> 5859 bytes
inherit_graph_125.map | 2 +-
inherit_graph_125.md5 | 2 +-
inherit_graph_125.png | Bin 4924 -> 5503 bytes
inherit_graph_126.md5 | 2 +-
inherit_graph_126.png | Bin 5527 -> 5446 bytes
inherit_graph_127.map | 3 +-
inherit_graph_127.md5 | 2 +-
inherit_graph_127.png | Bin 9575 -> 4924 bytes
inherit_graph_128.map | 3 +-
inherit_graph_128.md5 | 2 +-
inherit_graph_128.png | Bin 9695 -> 5527 bytes
inherit_graph_129.map | 4 +-
inherit_graph_129.md5 | 2 +-
inherit_graph_129.png | Bin 8560 -> 9575 bytes
inherit_graph_130.map | 3 +-
inherit_graph_130.md5 | 2 +-
inherit_graph_130.png | Bin 4907 -> 9695 bytes
inherit_graph_131.map | 3 +-
inherit_graph_131.md5 | 2 +-
inherit_graph_131.png | Bin 4314 -> 8560 bytes
inherit_graph_132.map | 2 +-
inherit_graph_132.md5 | 2 +-
inherit_graph_132.png | Bin 4487 -> 4907 bytes
inherit_graph_133.map | 2 +-
inherit_graph_133.md5 | 2 +-
inherit_graph_133.png | Bin 4716 -> 4314 bytes
inherit_graph_134.map | 2 +-
inherit_graph_134.md5 | 2 +-
inherit_graph_134.png | Bin 4685 -> 4487 bytes
inherit_graph_135.map | 2 +-
inherit_graph_135.md5 | 2 +-
inherit_graph_135.png | Bin 4555 -> 4716 bytes
inherit_graph_136.map | 2 +-
inherit_graph_136.md5 | 2 +-
inherit_graph_136.png | Bin 4873 -> 4685 bytes
inherit_graph_137.map | 2 +-
inherit_graph_137.md5 | 2 +-
inherit_graph_137.png | Bin 4879 -> 4555 bytes
inherit_graph_138.map | 2 +-
inherit_graph_138.md5 | 2 +-
inherit_graph_138.png | Bin 4270 -> 4873 bytes
inherit_graph_139.map | 2 +-
inherit_graph_139.md5 | 2 +-
inherit_graph_139.png | Bin 4653 -> 4879 bytes
inherit_graph_140.map | 2 +-
inherit_graph_140.md5 | 2 +-
inherit_graph_140.png | Bin 4397 -> 4270 bytes
inherit_graph_141.map | 2 +-
inherit_graph_141.md5 | 2 +-
inherit_graph_141.png | Bin 4084 -> 4653 bytes
inherit_graph_142.map | 2 +-
inherit_graph_142.md5 | 2 +-
inherit_graph_142.png | Bin 4717 -> 4397 bytes
inherit_graph_143.map | 2 +-
inherit_graph_143.md5 | 2 +-
inherit_graph_143.png | Bin 4328 -> 4084 bytes
inherit_graph_144.map | 2 +-
inherit_graph_144.md5 | 2 +-
inherit_graph_144.png | Bin 4129 -> 4717 bytes
inherit_graph_145.map | 2 +-
inherit_graph_145.md5 | 2 +-
inherit_graph_145.png | Bin 4426 -> 4328 bytes
inherit_graph_146.map | 2 +-
inherit_graph_146.md5 | 2 +-
inherit_graph_146.png | Bin 4798 -> 4129 bytes
inherit_graph_147.map | 3 +-
inherit_graph_147.md5 | 2 +-
inherit_graph_147.png | Bin 4722 -> 4426 bytes
inherit_graph_148.map | 4 +-
inherit_graph_148.md5 | 2 +-
inherit_graph_148.png | Bin 15572 -> 4798 bytes
inherit_graph_149.map | 5 +-
inherit_graph_149.md5 | 2 +-
inherit_graph_149.png | Bin 6059 -> 4722 bytes
inherit_graph_150.map | 6 +-
inherit_graph_150.md5 | 2 +-
inherit_graph_150.png | Bin 14697 -> 15572 bytes
inherit_graph_151.map | 5 +-
inherit_graph_151.md5 | 2 +-
inherit_graph_151.png | Bin 5794 -> 6059 bytes
inherit_graph_152.map | 6 +-
inherit_graph_152.md5 | 2 +-
inherit_graph_152.png | Bin 9942 -> 14697 bytes
inherit_graph_153.map | 4 +-
inherit_graph_153.md5 | 2 +-
inherit_graph_153.png | Bin 6670 -> 5794 bytes
inherit_graph_154.map | 4 +-
inherit_graph_154.md5 | 2 +-
inherit_graph_154.png | Bin 4344 -> 9942 bytes
inherit_graph_155.map | 5 +-
inherit_graph_155.md5 | 2 +-
inherit_graph_155.png | Bin 17647 -> 6670 bytes
inherit_graph_156.map | 5 +-
inherit_graph_156.md5 | 2 +-
inherit_graph_156.png | Bin 18886 -> 4344 bytes
inherit_graph_157.map | 10 +-
inherit_graph_157.md5 | 2 +-
inherit_graph_157.png | Bin 36946 -> 17647 bytes
inherit_graph_158.map | 9 +-
inherit_graph_158.md5 | 2 +-
inherit_graph_158.png | Bin 29445 -> 18886 bytes
inherit_graph_159.map | 8 +-
inherit_graph_159.md5 | 2 +-
inherit_graph_159.png | Bin 5198 -> 36946 bytes
inherit_graph_160.map | 6 +-
inherit_graph_160.md5 | 2 +-
inherit_graph_160.png | Bin 4159 -> 29445 bytes
inherit_graph_161.map | 2 +-
inherit_graph_161.md5 | 2 +-
inherit_graph_161.png | Bin 4525 -> 5198 bytes
inherit_graph_162.map | 2 +-
inherit_graph_162.md5 | 2 +-
inherit_graph_162.png | Bin 2720 -> 4159 bytes
inherit_graph_163.map | 3 +-
inherit_graph_163.md5 | 2 +-
inherit_graph_163.png | Bin 9645 -> 4525 bytes
inherit_graph_164.map | 4 +-
inherit_graph_164.md5 | 2 +-
inherit_graph_164.png | Bin 16662 -> 2720 bytes
inherit_graph_165.map | 4 +-
inherit_graph_165.md5 | 2 +-
inherit_graph_165.png | Bin 8408 -> 9645 bytes
inherit_graph_166.map | 5 +-
inherit_graph_166.md5 | 2 +-
inherit_graph_166.png | Bin 9215 -> 16662 bytes
inherit_graph_167.map | 9 +-
inherit_graph_167.md5 | 2 +-
inherit_graph_167.png | Bin 40800 -> 8408 bytes
inherit_graph_168.map | 3 +-
inherit_graph_168.md5 | 2 +-
inherit_graph_168.png | Bin 4088 -> 9215 bytes
inherit_graph_169.map | 8 +-
inherit_graph_169.md5 | 2 +-
inherit_graph_169.png | Bin 3479 -> 40800 bytes
inherit_graph_170.map | 2 +-
inherit_graph_170.md5 | 2 +-
inherit_graph_170.png | Bin 4179 -> 4088 bytes
inherit_graph_171.map | 3 +-
inherit_graph_171.md5 | 2 +-
inherit_graph_171.png | Bin 6278 -> 3479 bytes
inherit_graph_172.map | 2 +-
inherit_graph_172.md5 | 2 +-
inherit_graph_172.png | Bin 4420 -> 4179 bytes
inherit_graph_173.map | 3 +-
inherit_graph_173.md5 | 2 +-
inherit_graph_173.png | Bin 5149 -> 6278 bytes
inherit_graph_174.map | 2 +-
inherit_graph_174.md5 | 2 +-
inherit_graph_174.png | Bin 4878 -> 4420 bytes
inherit_graph_175.map | 2 +-
inherit_graph_175.md5 | 2 +-
inherit_graph_175.png | Bin 4909 -> 5149 bytes
inherit_graph_176.map | 2 +-
inherit_graph_176.md5 | 2 +-
inherit_graph_176.png | Bin 3793 -> 4878 bytes
inherit_graph_177.map | 3 +-
inherit_graph_177.md5 | 2 +-
inherit_graph_177.png | Bin 9803 -> 4909 bytes
inherit_graph_178.map | 3 +-
inherit_graph_178.md5 | 2 +-
inherit_graph_178.png | Bin 9013 -> 3793 bytes
inherit_graph_179.map | 4 +-
inherit_graph_179.md5 | 2 +-
inherit_graph_179.png | Bin 8304 -> 9803 bytes
inherit_graph_180.map | 4 +-
inherit_graph_180.md5 | 2 +-
inherit_graph_180.png | Bin 8145 -> 9013 bytes
inherit_graph_181.map | 3 +-
inherit_graph_181.md5 | 2 +-
inherit_graph_181.png | Bin 4294 -> 8304 bytes
inherit_graph_182.map | 3 +-
inherit_graph_182.md5 | 2 +-
inherit_graph_182.png | Bin 4658 -> 8145 bytes
inherit_graph_183.map | 2 +-
inherit_graph_183.md5 | 2 +-
inherit_graph_183.png | Bin 4246 -> 4294 bytes
inherit_graph_184.map | 2 +-
inherit_graph_184.md5 | 2 +-
inherit_graph_184.png | Bin 4589 -> 4658 bytes
inherit_graph_185.map | 3 +-
inherit_graph_185.md5 | 2 +-
inherit_graph_185.png | Bin 8967 -> 4246 bytes
inherit_graph_186.map | 4 +-
inherit_graph_186.md5 | 2 +-
inherit_graph_186.png | Bin 8539 -> 4589 bytes
inherit_graph_187.map | 4 +-
inherit_graph_187.md5 | 2 +-
inherit_graph_187.png | Bin 9218 -> 8967 bytes
inherit_graph_188.map | 5 +-
inherit_graph_188.md5 | 2 +-
inherit_graph_188.png | Bin 8540 -> 8539 bytes
inherit_graph_189.map | 4 +-
inherit_graph_189.md5 | 2 +-
inherit_graph_189.png | Bin 8046 -> 9218 bytes
inherit_graph_190.map | 3 +-
inherit_graph_190.md5 | 2 +-
inherit_graph_190.png | Bin 6478 -> 8540 bytes
inherit_graph_191.map | 3 +-
inherit_graph_191.md5 | 2 +-
inherit_graph_191.png | Bin 4408 -> 8046 bytes
inherit_graph_192.map | 3 +-
inherit_graph_192.md5 | 2 +-
inherit_graph_192.png | Bin 10192 -> 6478 bytes
inherit_graph_193.map | 2 +-
inherit_graph_193.md5 | 2 +-
inherit_graph_193.png | Bin 9112 -> 4408 bytes
inherit_graph_194.map | 3 +-
inherit_graph_194.md5 | 2 +-
inherit_graph_194.png | Bin 7322 -> 10192 bytes
inherit_graph_195.map | 5 +-
inherit_graph_195.md5 | 2 +-
inherit_graph_195.png | Bin 26197 -> 9112 bytes
inherit_graph_196.map | 3 +-
inherit_graph_196.md5 | 2 +-
inherit_graph_196.png | Bin 5272 -> 7322 bytes
inherit_graph_197.map | 6 +-
inherit_graph_197.md5 | 2 +-
inherit_graph_197.png | Bin 5688 -> 26197 bytes
inherit_graph_198.map | 4 +
inherit_graph_198.md5 | 1 +
inherit_graph_198.png | Bin 0 -> 5272 bytes
inherit_graph_199.map | 4 +
inherit_graph_199.md5 | 1 +
inherit_graph_199.png | Bin 0 -> 5688 bytes
inherits.html | 158 +--
...ents_1_1_deployment_1_1_i_dmb_factory.html | 2 +-
..._components_1_1_i_instance_operations.html | 6 +-
..._1_database_1_1_i_database_collection.html | 4 +-
...tabase_1_1_i_database_context-members.html | 8 +-
...t_1_1_database_1_1_i_database_context.html | 114 +-
...tabase_1_1_i_database_context_factory.html | 2 +-
...er_1_1_host_1_1_i_o_1_1_i_i_o_manager.html | 6 +-
...r_1_1_host_1_1_jobs_1_1_i_job_manager.html | 4 +-
...1_1_security_1_1_i_cryptography_suite.html | 2 +-
...ity_1_1_i_permissions_update_notifyee.html | 2 +-
..._1_1_system_1_1_i_platform_identifier.html | 2 +-
...ost_1_1_system_1_1_i_process_executor.html | 2 +-
...1_host_1_1_utils_1_1_i_port_allocator.html | 2 +-
search/all_10.js | 4 +-
search/all_11.js | 313 ++---
search/all_13.js | 309 ++---
search/all_14.js | 463 +++----
search/all_15.js | 237 ++--
search/all_18.js | 101 +-
search/all_2.js | 47 +-
search/all_4.js | 724 +++++------
search/all_5.js | 167 +--
search/all_6.js | 127 +-
search/all_7.js | 91 +-
search/all_8.js | 89 +-
search/all_9.js | 8 +-
search/all_a.js | 783 ++++++------
search/all_b.js | 41 +-
search/all_d.js | 35 +-
search/all_f.js | 8 +-
search/classes_8.js | 302 ++---
search/properties_10.js | 6 +-
search/properties_12.js | 10 +-
search/variables_11.js | 13 +-
search/variables_13.js | 53 +-
search/variables_2.js | 8 +-
search/variables_9.js | 4 +-
356 files changed, 7402 insertions(+), 6982 deletions(-)
create mode 100644 inherit_graph_198.map
create mode 100644 inherit_graph_198.md5
create mode 100644 inherit_graph_198.png
create mode 100644 inherit_graph_199.map
create mode 100644 inherit_graph_199.md5
create mode 100644 inherit_graph_199.png
diff --git a/_advanced_watchdog_8cs_source.html b/_advanced_watchdog_8cs_source.html
index 49454c2a95..f6bb7af779 100644
--- a/_advanced_watchdog_8cs_source.html
+++ b/_advanced_watchdog_8cs_source.html
@@ -461,7 +461,7 @@ $(function() {
bool Swapped
If MakeActive(CancellationToken) has been run.
ValueTask MakeActive(CancellationToken cancellationToken)
Make the SwappableDmbProvider active by replacing the live link with our CompileJob.
virtual ValueTask DisposeAsync()
-
+
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
A IWatchdog that, instead of killing servers for updates, uses the wonders of filesystem links to swa...
readonly List< Task > deploymentCleanupTasks
List<T> of Tasks that are waiting to clean up old deployments.
diff --git a/_application_8cs_source.html b/_application_8cs_source.html
index f64392b35a..1c5d873e16 100644
--- a/_application_8cs_source.html
+++ b/_application_8cs_source.html
@@ -756,7 +756,7 @@ $(function() {
Backend abstract implementation of IDatabaseContext.
-
+
IIOManager that resolves paths to Environment.CurrentDirectory.
IFilesystemLinkFactory for POSIX systems.
IPostWriteHandler for POSIX systems.
diff --git a/_basic_watchdog_8cs_source.html b/_basic_watchdog_8cs_source.html
index 996b28dda0..d4ccefdd99 100644
--- a/_basic_watchdog_8cs_source.html
+++ b/_basic_watchdog_8cs_source.html
@@ -366,7 +366,7 @@ $(function() {
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
-
+
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
ValueTask Save(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation . A ValueTask representing the running operation.
A IWatchdog that manages one server.
diff --git a/_chat_controller_8cs_source.html b/_chat_controller_8cs_source.html
index 43997e3be7..0e2e37b797 100644
--- a/_chat_controller_8cs_source.html
+++ b/_chat_controller_8cs_source.html
@@ -106,330 +106,328 @@ $(function() {
- 29using Z.EntityFramework.Plus;
-
-
-
-
- 37#pragma warning disable CA1506
-
-
-
-
-
- 51 ILogger<ChatController> logger,
-
-
-
-
- 56 authenticationContext,
-
-
-
-
-
-
-
-
-
-
- 73 IsAdminChannel = api.IsAdminChannel ??
false,
- 74 IsWatchdogChannel = api.IsWatchdogChannel ??
false,
- 75 IsUpdatesChannel = api.IsUpdatesChannel ??
false,
- 76 IsSystemChannel = api.IsSystemChannel ??
false,
-
-
-
- 80 if (api.ChannelData !=
null)
-
-
-
-
- 85 result.DiscordChannelId = ulong.Parse(api.ChannelData, CultureInfo.InvariantCulture);
-
-
- 88 result.IrcChannel = api.ChannelData;
-
-
- 91 throw new InvalidOperationException($
"Invalid chat provider: {chatProvider}");
-
-
-
-
-
-
-
-
-
-
-
- 110 ArgumentNullException.ThrowIfNull(model);
-
-
- 113 if (earlyOut !=
null)
-
-
-
-
-
-
- 120 .CountAsync(cancellationToken);
-
-
-
-
- 125 model.Enabled ??=
false;
- 126 model.ReconnectionInterval ??= 1;
-
-
- 129 var newChannels = model.Channels?.Select(x =>
ConvertApiChatChannel(x, model.Provider!.Value)).ToList() ??
new List<Models.ChatChannel>();
- 130 var dbModel =
new ChatBot(newChannels)
-
-
- 133 ConnectionString = model.ConnectionString,
- 134 Enabled = model.Enabled,
-
- 136 Provider = model.Provider,
- 137 ReconnectionInterval = model.ReconnectionInterval,
- 138 ChannelLimit = model.ChannelLimit,
-
+
+
+
+ 35#pragma warning disable CA1506
+
+
+
+
+
+ 49 ILogger<ChatController> logger,
+
+
+
+
+ 54 authenticationContext,
+
+
+
+
+
+
+
+
+
+
+ 71 IsAdminChannel = api.IsAdminChannel ??
false,
+ 72 IsWatchdogChannel = api.IsWatchdogChannel ??
false,
+ 73 IsUpdatesChannel = api.IsUpdatesChannel ??
false,
+ 74 IsSystemChannel = api.IsSystemChannel ??
false,
+
+
+
+ 78 if (api.ChannelData !=
null)
+
+
+
+
+ 83 result.DiscordChannelId = ulong.Parse(api.ChannelData, CultureInfo.InvariantCulture);
+
+
+ 86 result.IrcChannel = api.ChannelData;
+
+
+ 89 throw new InvalidOperationException($
"Invalid chat provider: {chatProvider}");
+
+
+
+
+
+
+
+
+
+
+
+ 108 ArgumentNullException.ThrowIfNull(model);
+
+
+ 111 if (earlyOut !=
null)
+
+
+
+
+
+
+ 118 .CountAsync(cancellationToken);
+
+
+
+
+ 123 model.Enabled ??=
false;
+ 124 model.ReconnectionInterval ??= 1;
+
+
+ 127 var newChannels = model.Channels?.Select(x =>
ConvertApiChatChannel(x, model.Provider!.Value)).ToList() ??
new List<Models.ChatChannel>();
+ 128 var dbModel =
new ChatBot(newChannels)
+
+
+ 131 ConnectionString = model.ConnectionString,
+ 132 Enabled = model.Enabled,
+
+ 134 Provider = model.Provider,
+ 135 ReconnectionInterval = model.ReconnectionInterval,
+ 136 ChannelLimit = model.ChannelLimit,
+
+
+
-
-
-
-
-
-
-
-
-
- 150 await instance.Chat.ChangeSettings(dbModel, cancellationToken);
-
- 152 if (dbModel.Channels.Count > 0)
- 153 await instance.Chat.ChangeChannels(dbModel.Id!.Value, dbModel.Channels, cancellationToken);
-
-
-
-
-
-
-
-
- 162 await instance.Chat.DeleteConnection(dbModel.Id!.Value,
default);
-
-
-
-
-
-
- 169 ?? this.
StatusCode(HttpStatusCode.Created, dbModel.ToApi());
-
-
-
-
- 181 [ProducesResponseType(204)]
- 182 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
-
-
-
-
- 187 instance.Chat.DeleteConnection(
id, cancellationToken),
-
-
-
- 191 .Where(x => x.Id ==
id)
- 192 .DeleteAsync(cancellationToken));
-
-
+
+
+
+
+
+
+
+ 148 await instance.Chat.ChangeSettings(dbModel, cancellationToken);
+
+ 150 if (dbModel.Channels.Count > 0)
+ 151 await instance.Chat.ChangeChannels(dbModel.Id!.Value, dbModel.Channels, cancellationToken);
+
+
+
+
+
+
+
+
+ 160 await instance.Chat.DeleteConnection(dbModel.Id!.Value,
default);
+
+
+
+
+
+
+ 167 ?? this.
StatusCode(HttpStatusCode.Created, dbModel.ToApi());
+
+
+
+
+ 179 [ProducesResponseType(204)]
+ 180 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
+
+
+
+
+ 185 instance.Chat.DeleteConnection(
id, cancellationToken),
+
+
+
+ 189 .Where(x => x.Id ==
id)
+ 190 .ExecuteDeleteAsync(cancellationToken));
+
+
+
+
-
-
-
-
-
- 209 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
-
-
- 212 return Paginated<ChatBot, ChatBotResponse>(
- 213 () => ValueTask.FromResult(
-
-
-
-
-
- 219 .Include(x => x.Channels)
- 220 .OrderBy(x => x.Id))),
-
-
- 223 if (!connectionStrings)
- 224 chatBot.ConnectionString = null;
-
- 226 return ValueTask.CompletedTask;
-
-
-
-
-
-
-
-
-
-
- 245 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
-
- 247 var query = DatabaseContext.ChatBots
-
- 249 .Where(x => x.Id ==
id && x.InstanceId ==
Instance.
Id)
- 250 .Include(x => x.Channels);
-
- 252 var results = await query.FirstOrDefaultAsync(cancellationToken);
- 253 if (results ==
default)
-
+
+
+
+ 207 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
+
+
+ 210 return Paginated<ChatBot, ChatBotResponse>(
+ 211 () => ValueTask.FromResult(
+
+
+
+
+
+ 217 .Include(x => x.Channels)
+ 218 .OrderBy(x => x.Id))),
+
+
+ 221 if (!connectionStrings)
+ 222 chatBot.ConnectionString = null;
+
+ 224 return ValueTask.CompletedTask;
+
+
+
+
+
+
+
+
+
+
+ 243 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
+
+ 245 var query = DatabaseContext.ChatBots
+
+ 247 .Where(x => x.Id ==
id && x.InstanceId ==
Instance.
Id)
+ 248 .Include(x => x.Channels);
+
+ 250 var results = await query.FirstOrDefaultAsync(cancellationToken);
+ 251 if (results ==
default)
+
+
+
-
-
- 258 if (!connectionStrings)
- 259 results.ConnectionString =
null;
-
- 261 return Json(results.ToApi());
-
-
-
-
-
- 276 [ProducesResponseType(204)]
-
- 278#pragma warning disable CA1502, CA1506
-
- 280#pragma warning restore CA1502, CA1506
-
- 282 ArgumentNullException.ThrowIfNull(model);
-
-
- 285 if (earlyOut !=
null)
-
-
-
-
-
- 291 .Where(x => x.InstanceId ==
Instance.
Id && x.Id == model.Id)
- 292 .Include(x => x.Channels);
+ 256 if (!connectionStrings)
+ 257 results.ConnectionString =
null;
+
+ 259 return Json(results.ToApi());
+
+
+
+
+
+ 274 [ProducesResponseType(204)]
+
+ 276#pragma warning disable CA1502, CA1506
+
+ 278#pragma warning restore CA1502, CA1506
+
+ 280 ArgumentNullException.ThrowIfNull(model);
+
+
+ 283 if (earlyOut !=
null)
+
+
+
+
+
+ 289 .Where(x => x.InstanceId ==
Instance.
Id && x.Id == model.Id)
+ 290 .Include(x => x.Channels);
+
+ 292 var current = await query.FirstOrDefaultAsync(cancellationToken);
- 294 var current = await query.FirstOrDefaultAsync(cancellationToken);
-
- 296 if (current ==
default)
-
-
- 299 if ((model.Channels?.Count ?? current.Channels!.Count) > (model.ChannelLimit ?? current.ChannelLimit!.Value))
-
-
-
- 303 if (model.Channels !=
null && model.ChannelLimit.HasValue)
- 304 return BadRequest(errorMessage);
- 305 return Conflict(errorMessage);
-
+ 294 if (current ==
default)
+
+
+ 297 if ((model.Channels?.Count ?? current.Channels!.Count) > (model.ChannelLimit ?? current.ChannelLimit!.Value))
+
+
+
+ 301 if (model.Channels !=
null && model.ChannelLimit.HasValue)
+ 302 return BadRequest(errorMessage);
+ 303 return Conflict(errorMessage);
+
+
+
-
+ 308 bool anySettingsModified =
false;
- 310 bool anySettingsModified =
false;
-
- 312 bool CheckModified<T>(Expression<Func<ChatBotSettings, T>> expression,
ChatBotRights requiredRight)
-
- 314 var memberSelectorExpression = (MemberExpression)expression.Body;
- 315 var property = (PropertyInfo)memberSelectorExpression.Member;
-
- 317 var newVal =
property.GetValue(model);
-
-
- 320 if (!userRights.HasFlag(requiredRight) &&
property.GetValue(current) != newVal)
-
-
- 323 property.SetValue(current, newVal);
- 324 anySettingsModified =
true;
-
-
+ 310 bool CheckModified<T>(Expression<Func<ChatBotSettings, T>> expression,
ChatBotRights requiredRight)
+
+ 312 var memberSelectorExpression = (MemberExpression)expression.Body;
+ 313 var property = (PropertyInfo)memberSelectorExpression.Member;
+
+ 315 var newVal =
property.GetValue(model);
+
+
+ 318 if (!userRights.HasFlag(requiredRight) &&
property.GetValue(current) != newVal)
+
+
+ 321 property.SetValue(current, newVal);
+ 322 anySettingsModified =
true;
+
+
+
+ 326 var oldProvider = current.Provider;
- 328 var oldProvider = current.Provider;
-
- 330 if (CheckModified(x => x.ConnectionString,
ChatBotRights.WriteConnectionString)
-
-
- 333 || CheckModified(x => x.Provider,
ChatBotRights.WriteProvider)
- 334 || CheckModified(x => x.ReconnectionInterval,
ChatBotRights.WriteReconnectionInterval)
- 335 || CheckModified(x => x.ChannelLimit,
ChatBotRights.WriteChannelLimit)
- 336 || (model.Channels !=
null && !userRights.HasFlag(
ChatBotRights.WriteChannels)))
-
-
- 339 var hasChannels = model.Channels !=
null;
- 340 if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
-
-
-
-
- 345 var dbChannels = model.Channels!.Select(x =>
ConvertApiChatChannel(x, model.Provider ?? current.Provider!.Value)).ToList();
-
- 347 current.Channels = dbChannels;
-
-
- 350 current.Channels!.Clear();
-
+ 328 if (CheckModified(x => x.ConnectionString,
ChatBotRights.WriteConnectionString)
+
+
+ 331 || CheckModified(x => x.Provider,
ChatBotRights.WriteProvider)
+ 332 || CheckModified(x => x.ReconnectionInterval,
ChatBotRights.WriteReconnectionInterval)
+ 333 || CheckModified(x => x.ChannelLimit,
ChatBotRights.WriteChannelLimit)
+ 334 || (model.Channels !=
null && !userRights.HasFlag(
ChatBotRights.WriteChannels)))
+
+
+ 337 var hasChannels = model.Channels !=
null;
+ 338 if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
+
+
+
+
+ 343 var dbChannels = model.Channels!.Select(x =>
ConvertApiChatChannel(x, model.Provider ?? current.Provider!.Value)).ToList();
+
+ 345 current.Channels = dbChannels;
+
+
+ 348 current.Channels!.Clear();
+
+
+
-
-
-
-
-
- 358 var chat = instance.Chat;
- 359 if (anySettingsModified)
- 360 await chat.ChangeSettings(current, cancellationToken);
-
- 362 if ((model.Channels !=
null || anySettingsModified) && current.Enabled!.Value)
- 363 await chat.ChangeChannels(current.Id!.Value, current.Channels, cancellationToken);
-
-
-
- 367 if (earlyOut !=
null)
-
-
-
-
-
- 373 current.ConnectionString =
null;
- 374 return Json(current.ToApi());
-
-
-
-
-
-
-
-
- 389 throw new InvalidOperationException(
"RecconnectionInterval cannot be zero!");
-
- 391 if (forCreation && !model.
Provider.HasValue)
-
-
- 394 if (model.
Name !=
null && String.IsNullOrWhiteSpace(model.
Name))
-
-
-
-
-
-
-
-
-
- 404 if (defaultMaxChannels > UInt16.MaxValue)
-
-
-
- 408 model.ChannelLimit ??= (ushort)defaultMaxChannels;
-
-
-
-
- 413#pragma warning restore CA1506
-
+
+
+
+ 356 var chat = instance.Chat;
+ 357 if (anySettingsModified)
+ 358 await chat.ChangeSettings(current, cancellationToken);
+
+ 360 if ((model.Channels !=
null || anySettingsModified) && current.Enabled!.Value)
+ 361 await chat.ChangeChannels(current.Id!.Value, current.Channels, cancellationToken);
+
+
+
+ 365 if (earlyOut !=
null)
+
+
+
+
+
+ 371 current.ConnectionString =
null;
+ 372 return Json(current.ToApi());
+
+
+
+
+
+
+
+
+ 387 throw new InvalidOperationException(
"RecconnectionInterval cannot be zero!");
+
+ 389 if (forCreation && !model.
Provider.HasValue)
+
+
+ 392 if (model.
Name !=
null && String.IsNullOrWhiteSpace(model.
Name))
+
+
+
+
+
+
+
+
+
+ 402 if (defaultMaxChannels > UInt16.MaxValue)
+
+
+
+ 406 model.ChannelLimit ??= (ushort)defaultMaxChannels;
+
+
+
+
+ 411#pragma warning restore CA1506
+
virtual ? long Id
The ID of the entity.
Metadata about a server instance.
ushort? ChatBotLimit
The maximum number of chat bots the Instance may contain.
@@ -450,15 +448,15 @@ $(function() {
const string List
The postfix for list operations.
const string Chat
The chat bot controller.
StatusCodeResult StatusCode(HttpStatusCode statusCode)
Strongly type calls to ControllerBase.StatusCode(int).
-ApiController for managing ChatBots.
-static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api, ChatProvider chatProvider)
Converts api to a ChatChannel.
+ApiController for managing ChatBots.
+static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api, ChatProvider chatProvider)
Converts api to a ChatChannel.
async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete a ChatBot.
-async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific ChatBot.
-BadRequestObjectResult? StandardModelChecks(ChatBotApiBase model, bool forCreation)
Perform some basic validation of a given model .
-async ValueTask< IActionResult > Update([FromBody] ChatBotUpdateRequest model, CancellationToken cancellationToken)
Updates a chat bot model .
-async ValueTask< IActionResult > Create([FromBody] ChatBotCreateRequest model, CancellationToken cancellationToken)
Create a new chat bot model .
-ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List ChatBots.
-ChatController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, ILogger< ChatController > logger, IInstanceManager instanceManager, IApiHeadersProvider apiHeaders)
Initializes a new instance of the ChatController class.
+async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific ChatBot.
+BadRequestObjectResult? StandardModelChecks(ChatBotApiBase model, bool forCreation)
Perform some basic validation of a given model .
+async ValueTask< IActionResult > Update([FromBody] ChatBotUpdateRequest model, CancellationToken cancellationToken)
Updates a chat bot model .
+async ValueTask< IActionResult > Create([FromBody] ChatBotCreateRequest model, CancellationToken cancellationToken)
Create a new chat bot model .
+ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List ChatBots.
+ChatController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, ILogger< ChatController > logger, IInstanceManager instanceManager, IApiHeadersProvider apiHeaders)
Initializes a new instance of the ChatController class.
async ValueTask< IActionResult?> WithComponentInstanceNullable(Func< IInstanceCore, ValueTask< IActionResult?> > action, Models.Instance? instance=null)
Run a given action with the relevant IInstance.
readonly IInstanceManager instanceManager
The IInstanceManager for the ComponentInterfacingController.
ComponentInterfacingController for operations that require an instance.
diff --git a/_database_context_8cs_source.html b/_database_context_8cs_source.html
index 7c2e4b1159..0fdb95c137 100644
--- a/_database_context_8cs_source.html
+++ b/_database_context_8cs_source.html
@@ -146,460 +146,472 @@ $(function() {
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 246 var configureFunction = typeof(TDatabaseContext).GetMethod(
-
- 248 BindingFlags.Public | BindingFlags.Static)
- 249 ??
throw new InvalidOperationException($
"Context type {typeof(TDatabaseContext).FullName} missing static {ConfigureMethodName} function!");
- 250 return (optionsBuilder, config) => configureFunction.Invoke(
null,
new object[] { optionsBuilder, config });
-
-
-
- 258 : base(dbContextOptions)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 278 public Task
Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
-
- 281 public Task
Drop(CancellationToken cancellationToken) => Database.EnsureDeletedAsync(cancellationToken);
-
- 284 public async ValueTask<bool>
Migrate(ILogger<DatabaseContext> logger, CancellationToken cancellationToken)
-
- 286 ArgumentNullException.ThrowIfNull(logger);
- 287 var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken);
- 288 var wasEmpty = !migrations.Any();
-
- 290 if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken)).Any())
-
- 292 logger.LogInformation(
"Migrating database...");
- 293 await Database.MigrateAsync(cancellationToken);
-
-
- 296 logger.LogDebug(
"No migrations to apply");
+
+
+ 262 var configureFunction = typeof(TDatabaseContext).GetMethod(
+
+ 264 BindingFlags.Public | BindingFlags.Static)
+ 265 ??
throw new InvalidOperationException($
"Context type {typeof(TDatabaseContext).FullName} missing static {ConfigureMethodName} function!");
+ 266 return (optionsBuilder, config) => configureFunction.Invoke(
null,
new object[] { optionsBuilder, config });
+
+
+
+ 274 : base(dbContextOptions)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 296 public Task
Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
- 298 wasEmpty |= !await
Users.AsQueryable().AnyAsync(cancellationToken);
-
-
-
-
-
-
- 306 ArgumentNullException.ThrowIfNull(modelBuilder);
+ 299 public Task
Drop(CancellationToken cancellationToken) => Database.EnsureDeletedAsync(cancellationToken);
+
+ 302 public async ValueTask<bool>
Migrate(ILogger<DatabaseContext> logger, CancellationToken cancellationToken)
+
+ 304 ArgumentNullException.ThrowIfNull(logger);
+ 305 var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken);
+ 306 var wasEmpty = !migrations.Any();
- 308 base.OnModelCreating(modelBuilder);
-
- 310 var userModel = modelBuilder.Entity<
User>();
- 311 userModel.HasIndex(x => x.CanonicalName).IsUnique();
- 312 userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
- 313 userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
- 314 userModel.HasMany(x => x.OAuthConnections).WithOne(x => x.User).OnDelete(DeleteBehavior.Cascade);
+ 308 if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken)).Any())
+
+ 310 logger.LogInformation(
"Migrating database...");
+ 311 await Database.MigrateAsync(cancellationToken);
+
+
+ 314 logger.LogDebug(
"No migrations to apply");
- 316 modelBuilder.Entity<
OAuthConnection>().HasIndex(x =>
new { x.Provider, x.ExternalUserId }).IsUnique();
+ 316 wasEmpty |= !await
Users.AsQueryable().AnyAsync(cancellationToken);
- 318 var groupsModel = modelBuilder.Entity<
UserGroup>();
- 319 groupsModel.HasIndex(x => x.Name).IsUnique();
- 320 groupsModel.HasMany(x => x.Users).WithOne(x => x.Group).OnDelete(DeleteBehavior.ClientSetNull);
-
- 322 var permissionSetModel = modelBuilder.Entity<
PermissionSet>();
- 323 permissionSetModel.HasOne(x => x.Group).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
- 324 permissionSetModel.HasOne(x => x.User).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
- 325 permissionSetModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
-
- 327 modelBuilder.Entity<
InstancePermissionSet>().HasIndex(x =>
new { x.PermissionSetId, x.InstanceId }).IsUnique();
-
-
- 330 revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
- 331 revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
- 332 revInfo.HasIndex(x =>
new { x.InstanceId, x.CommitSha }).IsUnique();
+
+
+
+
+
+ 324 ArgumentNullException.ThrowIfNull(modelBuilder);
+
+ 326 base.OnModelCreating(modelBuilder);
+
+ 328 var userModel = modelBuilder.Entity<
User>();
+ 329 userModel.HasIndex(x => x.CanonicalName).IsUnique();
+ 330 userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
+ 331 userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
+ 332 userModel.HasMany(x => x.OAuthConnections).WithOne(x => x.User).OnDelete(DeleteBehavior.Cascade);
-
-
-
-
-
-
-
-
-
-
- 344 modelBuilder.Entity<
TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
-
- 346 var compileJob = modelBuilder.Entity<
CompileJob>();
- 347 compileJob.HasIndex(x => x.DirectoryName);
- 348 compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
-
- 350 modelBuilder.Entity<
ReattachInformation>().HasOne(x => x.CompileJob).WithMany().OnDelete(DeleteBehavior.Cascade);
+ 334 modelBuilder.Entity<
OAuthConnection>().HasIndex(x =>
new { x.Provider, x.ExternalUserId }).IsUnique();
+
+ 336 var groupsModel = modelBuilder.Entity<
UserGroup>();
+ 337 groupsModel.HasIndex(x => x.Name).IsUnique();
+ 338 groupsModel.HasMany(x => x.Users).WithOne(x => x.Group).OnDelete(DeleteBehavior.ClientSetNull);
+
+ 340 var permissionSetModel = modelBuilder.Entity<
PermissionSet>();
+ 341 permissionSetModel.HasOne(x => x.Group).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+ 342 permissionSetModel.HasOne(x => x.User).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+ 343 permissionSetModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+
+ 345 modelBuilder.Entity<
InstancePermissionSet>().HasIndex(x =>
new { x.PermissionSetId, x.InstanceId }).IsUnique();
+
+
+ 348 revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
+ 349 revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
+ 350 revInfo.HasIndex(x =>
new { x.InstanceId, x.CommitSha }).IsUnique();
- 352 var chatChannel = modelBuilder.Entity<
ChatChannel>();
- 353 chatChannel.HasIndex(x =>
new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
- 354 chatChannel.HasIndex(x =>
new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
- 355 chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
-
- 357 modelBuilder.Entity<
ChatBot>().HasIndex(x =>
new { x.InstanceId, x.Name }).IsUnique();
-
- 359 var instanceModel = modelBuilder.Entity<
Instance>();
- 360 instanceModel.HasIndex(x =>
new { x.Path, x.SwarmIdentifer }).IsUnique();
- 361 instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 362 instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 363 instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 364 instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 365 instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 366 instanceModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
- 367 instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
+
+
+
+
+
+
+
+
+
+
+ 362 modelBuilder.Entity<
TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
+
+ 364 var compileJob = modelBuilder.Entity<
CompileJob>();
+ 365 compileJob.HasIndex(x => x.DirectoryName);
+ 366 compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
+
+ 368 modelBuilder.Entity<
ReattachInformation>().HasOne(x => x.CompileJob).WithMany().OnDelete(DeleteBehavior.Cascade);
-
-
-
-
+ 370 var chatChannel = modelBuilder.Entity<
ChatChannel>();
+ 371 chatChannel.HasIndex(x =>
new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
+ 372 chatChannel.HasIndex(x =>
new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
+ 373 chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
-
-
-
-
-
-
-
-
- 396#pragma warning disable CA1502
-
- 398 ILogger<DatabaseContext> logger,
- 399 Version targetVersion,
-
- 401 CancellationToken cancellationToken)
-
- 403 ArgumentNullException.ThrowIfNull(logger);
- 404 ArgumentNullException.ThrowIfNull(targetVersion);
- 405 if (targetVersion <
new Version(4, 0))
- 406 throw new ArgumentOutOfRangeException(nameof(targetVersion), targetVersion,
"Cannot migrate below version 4.0.0!");
+ 375 modelBuilder.Entity<
ChatBot>().HasIndex(x =>
new { x.InstanceId, x.Name }).IsUnique();
+
+ 377 var instanceModel = modelBuilder.Entity<
Instance>();
+ 378 instanceModel.HasIndex(x =>
new { x.Path, x.SwarmIdentifer }).IsUnique();
+ 379 instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 380 instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 381 instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 382 instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 383 instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 384 instanceModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+ 385 instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
+
+
+
+
+
+
+
+
+
+
+
- 408 if (currentDatabaseType ==
DatabaseType.PostgresSql && targetVersion <
new Version(4, 3, 0))
- 409 throw new NotSupportedException(
"Cannot migrate below version 4.3.0 with PostgresSql!");
-
-
-
-
- 414 if (targetVersion <
new Version(4, 1, 0))
- 415 throw new NotSupportedException(
"Cannot migrate below version 4.1.0!");
-
-
- 418 string? targetMigration =
null;
-
- 420 string BadDatabaseType() =>
throw new ArgumentException($
"Invalid DatabaseType: {currentDatabaseType}", nameof(currentDatabaseType));
-
- 422 if (targetVersion <
new Version(6, 7, 0))
- 423 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 429 _ => BadDatabaseType(),
-
+
+
+ 414#pragma warning disable CA1502
+
+ 416 ILogger<DatabaseContext> logger,
+ 417 Version targetVersion,
+
+ 419 CancellationToken cancellationToken)
+
+ 421 ArgumentNullException.ThrowIfNull(logger);
+ 422 ArgumentNullException.ThrowIfNull(targetVersion);
+ 423 if (targetVersion <
new Version(4, 0))
+ 424 throw new ArgumentOutOfRangeException(nameof(targetVersion), targetVersion,
"Cannot migrate below version 4.0.0!");
+
+ 426 if (currentDatabaseType ==
DatabaseType.PostgresSql && targetVersion <
new Version(4, 3, 0))
+ 427 throw new NotSupportedException(
"Cannot migrate below version 4.3.0 with PostgresSql!");
+
+
+
- 432 if (targetVersion <
new Version(6, 6, 0))
- 433 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 439 _ => BadDatabaseType(),
-
-
- 442 if (targetVersion <
new Version(6, 5, 0))
- 443 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 449 _ => BadDatabaseType(),
-
-
- 452 if (targetVersion <
new Version(6, 2, 0))
- 453 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 459 _ => BadDatabaseType(),
-
-
- 462 if (targetVersion <
new Version(6, 0, 0))
- 463 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 469 _ => BadDatabaseType(),
-
- 471 if (targetVersion <
new Version(5, 17, 0))
- 472 targetMigration = currentDatabaseType
switch
-
-
-
-
-
- 478 _ => BadDatabaseType(),
-
- 480 if (targetVersion <
new Version(5, 13, 0))
+ 432 if (targetVersion <
new Version(4, 1, 0))
+ 433 throw new NotSupportedException(
"Cannot migrate below version 4.1.0!");
+
+
+ 436 string? targetMigration =
null;
+
+ 438 string BadDatabaseType() =>
throw new ArgumentException($
"Invalid DatabaseType: {currentDatabaseType}", nameof(currentDatabaseType));
+
+ 440 if (targetVersion <
new Version(6, 7, 0))
+ 441 targetMigration = currentDatabaseType
switch
+
+
+
+
+
+ 447 _ => BadDatabaseType(),
+
+
+ 450 if (targetVersion <
new Version(6, 6, 0))
+ 451 targetMigration = currentDatabaseType
switch
+
+
+
+
+
+ 457 _ => BadDatabaseType(),
+
+
+ 460 if (targetVersion <
new Version(6, 5, 0))
+ 461 targetMigration = currentDatabaseType
switch
+
+
+
+
+
+ 467 _ => BadDatabaseType(),
+
+
+ 470 if (targetVersion <
new Version(6, 2, 0))
+ 471 targetMigration = currentDatabaseType
switch
+
+
+
+
+
+ 477 _ => BadDatabaseType(),
+
+
+ 480 if (targetVersion <
new Version(6, 0, 0))
481 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
487 _ => BadDatabaseType(),
- 489 if (targetVersion <
new Version(5, 7, 3))
+ 489 if (targetVersion <
new Version(5, 17, 0))
490 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
496 _ => BadDatabaseType(),
- 498 if (targetVersion <
new Version(5, 7, 0))
+ 498 if (targetVersion <
new Version(5, 13, 0))
499 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
505 _ => BadDatabaseType(),
- 507 if (targetVersion <
new Version(4, 19, 0))
+ 507 if (targetVersion <
new Version(5, 7, 3))
508 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
514 _ => BadDatabaseType(),
- 516 if (targetVersion <
new Version(4, 18, 0))
+ 516 if (targetVersion <
new Version(5, 7, 0))
517 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
523 _ => BadDatabaseType(),
- 525 if (targetVersion <
new Version(4, 14, 0))
+ 525 if (targetVersion <
new Version(4, 19, 0))
526 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
532 _ => BadDatabaseType(),
- 534 if (targetVersion <
new Version(4, 10, 0))
+ 534 if (targetVersion <
new Version(4, 18, 0))
535 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
541 _ => BadDatabaseType(),
- 543 if (targetVersion <
new Version(4, 8, 0))
+ 543 if (targetVersion <
new Version(4, 14, 0))
544 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
550 _ => BadDatabaseType(),
- 552 if (targetVersion <
new Version(4, 7, 0))
+ 552 if (targetVersion <
new Version(4, 10, 0))
553 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
559 _ => BadDatabaseType(),
- 561 if (targetVersion <
new Version(4, 6, 0))
+ 561 if (targetVersion <
new Version(4, 8, 0))
562 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
568 _ => BadDatabaseType(),
- 570 if (targetVersion <
new Version(4, 5, 0))
+ 570 if (targetVersion <
new Version(4, 7, 0))
571 targetMigration = currentDatabaseType
switch
-
-
-
-
+
+
+
+
577 _ => BadDatabaseType(),
- 579 if (targetVersion <
new Version(4, 4, 0))
+ 579 if (targetVersion <
new Version(4, 6, 0))
580 targetMigration = currentDatabaseType
switch
-
- 583 DatabaseType.PostgresSql => nameof(
PGCreate),
-
-
+
+
+
+
586 _ => BadDatabaseType(),
- 588 if (targetVersion <
new Version(4, 2, 0))
-
-
- 591 if (targetMigration ==
null)
-
- 593 logger.LogDebug(
"No down migration required.");
-
-
-
-
- 598 var migrationSubstitution = currentDatabaseType
switch
-
- 600 DatabaseType.SqlServer =>
null,
- 601 DatabaseType.MySql =>
"MY{0}",
- 602 DatabaseType.Sqlite =>
"SL{0}",
- 603 DatabaseType.PostgresSql =>
"PG{0}",
- 604 _ =>
throw new InvalidOperationException($
"Invalid DatabaseType: {currentDatabaseType}"),
-
-
- 607 if (migrationSubstitution !=
null)
- 608 targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration[2..]);
-
-
- 611 var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
- 612 var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
-
- 614 logger.LogInformation(
"Migrating down to version {targetVersion}. Target: {targetMigration}", targetVersion, targetMigration);
-
-
- 617 await migrator.MigrateAsync(targetMigration, cancellationToken);
-
-
-
- 621 logger.LogCritical(e,
"Failed to migrate!");
-
-
- 624#pragma warning restore CA1502
-
-
+ 588 if (targetVersion <
new Version(4, 5, 0))
+ 589 targetMigration = currentDatabaseType
switch
+
+
+
+
+
+ 595 _ => BadDatabaseType(),
+
+ 597 if (targetVersion <
new Version(4, 4, 0))
+ 598 targetMigration = currentDatabaseType
switch
+
+
+ 601 DatabaseType.PostgresSql => nameof(
PGCreate),
+
+
+ 604 _ => BadDatabaseType(),
+
+ 606 if (targetVersion <
new Version(4, 2, 0))
+
+
+ 609 if (targetMigration ==
null)
+
+ 611 logger.LogDebug(
"No down migration required.");
+
+
+
+
+ 616 var migrationSubstitution = currentDatabaseType
switch
+
+ 618 DatabaseType.SqlServer =>
null,
+ 619 DatabaseType.MySql =>
"MY{0}",
+ 620 DatabaseType.Sqlite =>
"SL{0}",
+ 621 DatabaseType.PostgresSql =>
"PG{0}",
+ 622 _ =>
throw new InvalidOperationException($
"Invalid DatabaseType: {currentDatabaseType}"),
+
+
+ 625 if (migrationSubstitution !=
null)
+ 626 targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration[2..]);
+
+
+ 629 var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
+ 630 var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
+
+ 632 logger.LogInformation(
"Migrating down to version {targetVersion}. Target: {targetMigration}", targetVersion, targetMigration);
+
+
+ 635 await migrator.MigrateAsync(targetMigration, cancellationToken);
+
+
+
+ 639 logger.LogCritical(e,
"Failed to migrate!");
+
+
+ 642#pragma warning restore CA1502
+
+
Backend abstract implementation of IDatabaseContext.
DbSet< ReattachInformation > ReattachInformations
The ReattachInformations in the DatabaseContext.
-readonly IDatabaseCollection< UserGroup > groups
Backing field for IDatabaseContext.Groups.
+readonly IDatabaseCollection< UserGroup > groups
Backing field for IDatabaseContext.Groups.
DbSet< Job > Jobs
The Jobs in the DatabaseContext.
DbSet< Instance > Instances
The Instances in the DatabaseContext.
-readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
-virtual DeleteBehavior RevInfoCompileJobDeleteBehavior
The DeleteBehavior for the CompileJob/RevisionInformation foreign key.
-readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
+readonly IDatabaseCollection< RevInfoTestMerge > revInfoTestMergesCollection
Backing field for IDatabaseContext.RevInfoTestMerges.
+readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
+virtual DeleteBehavior RevInfoCompileJobDeleteBehavior
The DeleteBehavior for the CompileJob/RevisionInformation foreign key.
+readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
DbSet< OAuthConnection > OAuthConnections
The OAuthConnections in the DatabaseContext.
-readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
-readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
-override void OnModelCreating(ModelBuilder modelBuilder)
+readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
+readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
+override void OnModelCreating(ModelBuilder modelBuilder)
DbSet< ChatChannel > ChatChannels
The ChatChannels in the DatabaseContext.
-DatabaseContext(DbContextOptions dbContextOptions)
Initializes a new instance of the DatabaseContext class.
-readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
-readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
+DatabaseContext(DbContextOptions dbContextOptions)
Initializes a new instance of the DatabaseContext class.
+readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
+readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
DbSet< InstancePermissionSet > InstancePermissionSets
The InstancePermissionSets in the DatabaseContext.
DbSet< PermissionSet > PermissionSets
The PermissionSets in the DatabaseContext.
-readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
+readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext.
-async ValueTask< bool > Migrate(ILogger< DatabaseContext > logger, CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext. A ValueTask<TResult> resulting in true if the database sho...
-readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
+async ValueTask< bool > Migrate(ILogger< DatabaseContext > logger, CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext. A ValueTask<TResult> resulting in true if the database sho...
+readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
DbSet< TestMerge > TestMerges
The TestMerges in the DatabaseContext.
-async ValueTask SchemaDowngradeForServerVersion(ILogger< DatabaseContext > logger, Version targetVersion, DatabaseType currentDatabaseType, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server targetVersion ....
-readonly IDatabaseCollection< InstancePermissionSet > instancePermissionSetsCollection
Backing field for IDatabaseContext.InstancePermissionSets.
+async ValueTask SchemaDowngradeForServerVersion(ILogger< DatabaseContext > logger, Version targetVersion, DatabaseType currentDatabaseType, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server targetVersion ....
+readonly IDatabaseCollection< InstancePermissionSet > instancePermissionSetsCollection
Backing field for IDatabaseContext.InstancePermissionSets.
Task Drop(CancellationToken cancellationToken)
Attempts to delete all tables and drop the database in use. A Task representing the running operation...
-readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
+readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
-readonly IDatabaseCollection< PermissionSet > permissionSets
Backing field for IDatabaseContext.PermissionSets.
-readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
-readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
+readonly IDatabaseCollection< PermissionSet > permissionSets
Backing field for IDatabaseContext.PermissionSets.
+readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
+readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
DbSet< User > Users
The Users in the DatabaseContext.
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext.
DbSet< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges in the DatabaseContext.
-readonly IDatabaseCollection< OAuthConnection > oAuthConnections
Backing field for IDatabaseContext.OAuthConnections.
-static Action< DbContextOptionsBuilder, DatabaseConfiguration > GetConfigureAction< TDatabaseContext >()
Gets the configure action for a given TDatabaseContext .
+readonly IDatabaseCollection< OAuthConnection > oAuthConnections
Backing field for IDatabaseContext.OAuthConnections.
+readonly IDatabaseCollection< TestMerge > testMergesCollection
Backing field for IDatabaseContext.TestMerges.
+static Action< DbContextOptionsBuilder, DatabaseConfiguration > GetConfigureAction< TDatabaseContext >()
Gets the configure action for a given TDatabaseContext .
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the DatabaseContext.
DbSet< UserGroup > Groups
The UserGroups in the DatabaseContext.
Adds the AdditionalParameters DD column for MSSQL.
diff --git a/_database_seeder_8cs_source.html b/_database_seeder_8cs_source.html
index 8d10caa3ba..1ce7f5a00f 100644
--- a/_database_seeder_8cs_source.html
+++ b/_database_seeder_8cs_source.html
@@ -94,249 +94,247 @@ $(function() {
- 17using Z.EntityFramework.Plus;
-
-
-
-
-
-
-
-
-
-
-
- 42 readonly ILogger<DatabaseSeeder>
logger;
-
-
-
-
-
-
-
-
-
- 67 bool alreadyExists = tgsUser !=
null;
- 68 tgsUser ??=
new User()
-
- 70 CreatedAt = DateTimeOffset.UtcNow,
-
-
-
-
-
- 76 tgsUser.PasswordHash =
"_";
- 77 tgsUser.Enabled =
false;
-
-
-
-
-
-
-
-
-
- 97 IOptions<GeneralConfiguration> generalConfigurationOptions,
- 98 IOptions<DatabaseConfiguration> databaseConfigurationOptions,
- 99 IOptions<SwarmConfiguration> swarmConfigurationOptions,
-
- 101 ILogger<DatabaseSeeder>
logger)
-
-
-
- 105 databaseConfiguration = databaseConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(databaseConfigurationOptions));
- 106 generalConfiguration = generalConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(generalConfigurationOptions));
- 107 swarmConfiguration = swarmConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(swarmConfigurationOptions));
-
- 109 this.logger =
logger ??
throw new ArgumentNullException(nameof(
logger));
-
-
-
-
- 115 ArgumentNullException.ThrowIfNull(databaseContext);
-
-
-
- 119 logger.LogCritical(
"DropDatabase configuration option set! Dropping any existing database...");
- 120 await databaseContext.
Drop(cancellationToken);
-
-
-
-
-
- 126 logger.LogInformation(
"Seeding database...");
-
-
-
-
-
-
- 133 logger.LogWarning(
"Enabling and resetting admin password due to configuration!");
-
-
-
-
-
-
-
-
-
- 144 ArgumentNullException.ThrowIfNull(databaseContext);
- 145 ArgumentNullException.ThrowIfNull(downgradeVersion);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 168 CreatedAt = DateTimeOffset.UtcNow,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 190 await databaseContext.
Save(cancellationToken);
-
- 192 adminUser.CreatedBy = tgsUser;
-
- 194 await databaseContext.
Save(cancellationToken);
-
-
-
-
- 205 var admin = await
GetAdminUser(databaseContext, cancellationToken);
-
-
- 208 if (admin.PermissionSet !=
null)
-
-
-
-
-
-
-
-
- 217 if (admin.CreatedBy ==
null)
-
- 219 var tgsUser = await databaseContext
-
-
-
- 223 .FirstOrDefaultAsync(cancellationToken);
-
-
-
- 227 "A user named TGS (Canonically) exists but isn't marked as the admin's creator. This may be because it was created manually. This user is going to be adapted to use as the starter of system jobs.");
-
-
- 230 admin.CreatedBy = tgsUser;
-
-
-
-
- 235 var allInstances = await databaseContext
-
-
-
- 239 .ToListAsync(cancellationToken);
- 240 foreach (var instance
in allInstances)
-
-
-
-
- 245 var ids = await databaseContext
-
-
- 248 .Where(x => x.TopicRequestTimeout == 0)
-
- 250 .ToListAsync(cancellationToken);
-
- 252 var rowsUpdated = ids.Count;
- 253 foreach (var
id in ids)
-
-
-
-
-
-
- 260 databaseContext.DreamDaemonSettings.Attach(newDDSettings);
-
-
-
-
-
- 266 "Updated {count} instances to use database backed BYOND topic timeouts from configuration setting of {timeout}",
-
-
-
-
- 271 await databaseContext.Save(cancellationToken);
-
-
-
-
- 282 var admin = await
GetAdminUser(databaseContext, cancellationToken);
-
-
- 285 admin.Enabled =
true;
-
-
- 288 if (admin.PermissionSet ==
null)
-
-
- 291 admin.GroupId =
null;
-
-
-
-
-
-
-
-
-
-
-
- 303 await databaseContext.
Save(cancellationToken);
-
-
-
-
- 314 var admin = await databaseContext
-
-
-
- 318 .Include(x => x.CreatedBy)
- 319 .Include(x => x.PermissionSet)
- 320 .Include(x => x.Group)
- 321 .FirstOrDefaultAsync(cancellationToken);
- 322 if (admin ==
default)
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ 40 readonly ILogger<DatabaseSeeder>
logger;
+
+
+
+
+
+
+
+
+
+ 65 bool alreadyExists = tgsUser !=
null;
+ 66 tgsUser ??=
new User()
+
+ 68 CreatedAt = DateTimeOffset.UtcNow,
+
+
+
+
+
+ 74 tgsUser.PasswordHash =
"_";
+ 75 tgsUser.Enabled =
false;
+
+
+
+
+
+
+
+
+
+ 95 IOptions<GeneralConfiguration> generalConfigurationOptions,
+ 96 IOptions<DatabaseConfiguration> databaseConfigurationOptions,
+ 97 IOptions<SwarmConfiguration> swarmConfigurationOptions,
+
+ 99 ILogger<DatabaseSeeder>
logger)
+
+
+
+ 103 databaseConfiguration = databaseConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(databaseConfigurationOptions));
+ 104 generalConfiguration = generalConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(generalConfigurationOptions));
+ 105 swarmConfiguration = swarmConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(swarmConfigurationOptions));
+
+ 107 this.logger =
logger ??
throw new ArgumentNullException(nameof(
logger));
+
+
+
+
+ 113 ArgumentNullException.ThrowIfNull(databaseContext);
+
+
+
+ 117 logger.LogCritical(
"DropDatabase configuration option set! Dropping any existing database...");
+ 118 await databaseContext.
Drop(cancellationToken);
+
+
+
+
+
+ 124 logger.LogInformation(
"Seeding database...");
+
+
+
+
+
+
+ 131 logger.LogWarning(
"Enabling and resetting admin password due to configuration!");
+
+
+
+
+
+
+
+
+
+ 142 ArgumentNullException.ThrowIfNull(databaseContext);
+ 143 ArgumentNullException.ThrowIfNull(downgradeVersion);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 166 CreatedAt = DateTimeOffset.UtcNow,
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 188 await databaseContext.
Save(cancellationToken);
+
+ 190 adminUser.CreatedBy = tgsUser;
+
+ 192 await databaseContext.
Save(cancellationToken);
+
+
+
+
+ 203 var admin = await
GetAdminUser(databaseContext, cancellationToken);
+
+
+ 206 if (admin.PermissionSet !=
null)
+
+
+
+
+
+
+
+
+ 215 if (admin.CreatedBy ==
null)
+
+ 217 var tgsUser = await databaseContext
+
+
+
+ 221 .FirstOrDefaultAsync(cancellationToken);
+
+
+
+ 225 "A user named TGS (Canonically) exists but isn't marked as the admin's creator. This may be because it was created manually. This user is going to be adapted to use as the starter of system jobs.");
+
+
+ 228 admin.CreatedBy = tgsUser;
+
+
+
+
+ 233 var allInstances = await databaseContext
+
+
+
+ 237 .ToListAsync(cancellationToken);
+ 238 foreach (var instance
in allInstances)
+
+
+
+
+ 243 var ids = await databaseContext
+
+
+ 246 .Where(x => x.TopicRequestTimeout == 0)
+
+ 248 .ToListAsync(cancellationToken);
+
+ 250 var rowsUpdated = ids.Count;
+ 251 foreach (var
id in ids)
+
+
+
+
+
+
+ 258 databaseContext.DreamDaemonSettings.Attach(newDDSettings);
+
+
+
+
+
+ 264 "Updated {count} instances to use database backed BYOND topic timeouts from configuration setting of {timeout}",
+
+
+
+
+ 269 await databaseContext.Save(cancellationToken);
+
+
+
+
+ 280 var admin = await
GetAdminUser(databaseContext, cancellationToken);
+
+
+ 283 admin.Enabled =
true;
+
+
+ 286 if (admin.PermissionSet ==
null)
+
+
+ 289 admin.GroupId =
null;
+
+
+
+
+
+
+
+
+
+
+
+ 301 await databaseContext.
Save(cancellationToken);
+
+
+
+
+ 312 var admin = await databaseContext
+
+
+
+ 316 .Include(x => x.CreatedBy)
+ 317 .Include(x => x.PermissionSet)
+ 318 .Include(x => x.Group)
+ 319 .FirstOrDefaultAsync(cancellationToken);
+ 320 if (admin ==
default)
+
+
+
+
+
+
Represents initial credentials used by the server.
static readonly string DefaultAdminUserPassword
The default admin password.
static readonly string AdminUserName
The name of the default admin user.
@@ -349,23 +347,23 @@ $(function() {
General configuration options.
uint ByondTopicTimeout
The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single ...
Configuration for the server swarm system.
-
-readonly ILogger< DatabaseContext > databaseLogger
The ILogger used for IDatabaseContexts.
-async ValueTask< User?> GetAdminUser(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Get or create the admin User.
-async ValueTask ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default, enables the account,...
-readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the DatabaseSeeder.
-User SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext .
-async ValueTask SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext .
-DatabaseSeeder(ICryptographySuite cryptographySuite, IPlatformIdentifier platformIdentifier, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< DatabaseContext > databaseLogger, ILogger< DatabaseSeeder > logger)
Initializes a new instance of the DatabaseSeeder class.
-readonly DatabaseConfiguration databaseConfiguration
The DatabaseConfiguration for the DatabaseSeeder.
-readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseSeeder.
-readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the DatabaseSeeder.
-ValueTask Downgrade(IDatabaseContext databaseContext, Version downgradeVersion, CancellationToken cancellationToken)
Migrate a given databaseContext down. A ValueTask representing the running operation.
-readonly ILogger< DatabaseSeeder > logger
The ILogger for the DatabaseSeeder.
-async ValueTask SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Correct invalid database data caused by previous versions (NOT user fuckery).
-async ValueTask Initialize(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Setup up a given databaseContext . A ValueTask representing the running operation.
-static User SeedSystemUser(IDatabaseContext databaseContext, User? tgsUser=null)
Add a default system User to a given databaseContext .
-readonly SwarmConfiguration swarmConfiguration
The SwarmConfiguration for the DatabaseSeeder.
+
+readonly ILogger< DatabaseContext > databaseLogger
The ILogger used for IDatabaseContexts.
+async ValueTask< User?> GetAdminUser(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Get or create the admin User.
+async ValueTask ResetAdminPassword(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Changes the admin password in IDatabaseContext back to it's default, enables the account,...
+readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the DatabaseSeeder.
+User SeedAdminUser(IDatabaseContext databaseContext)
Add a default admin User to a given databaseContext .
+async ValueTask SeedDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Initially seed a given databaseContext .
+DatabaseSeeder(ICryptographySuite cryptographySuite, IPlatformIdentifier platformIdentifier, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, ILogger< DatabaseContext > databaseLogger, ILogger< DatabaseSeeder > logger)
Initializes a new instance of the DatabaseSeeder class.
+readonly DatabaseConfiguration databaseConfiguration
The DatabaseConfiguration for the DatabaseSeeder.
+readonly ICryptographySuite cryptographySuite
The ICryptographySuite for the DatabaseSeeder.
+readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the DatabaseSeeder.
+ValueTask Downgrade(IDatabaseContext databaseContext, Version downgradeVersion, CancellationToken cancellationToken)
Migrate a given databaseContext down. A ValueTask representing the running operation.
+readonly ILogger< DatabaseSeeder > logger
The ILogger for the DatabaseSeeder.
+async ValueTask SanitizeDatabase(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Correct invalid database data caused by previous versions (NOT user fuckery).
+async ValueTask Initialize(IDatabaseContext databaseContext, CancellationToken cancellationToken)
Setup up a given databaseContext . A ValueTask representing the running operation.
+static User SeedSystemUser(IDatabaseContext databaseContext, User? tgsUser=null)
Add a default system User to a given databaseContext .
+readonly SwarmConfiguration swarmConfiguration
The SwarmConfiguration for the DatabaseSeeder.
diff --git a/_i_database_context_8cs_source.html b/_i_database_context_8cs_source.html
index e5d3f4398e..63dd1b5389 100644
--- a/_i_database_context_8cs_source.html
+++ b/_i_database_context_8cs_source.html
@@ -104,57 +104,63 @@ $(function() {
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- 98 Task
Save(CancellationToken cancellationToken);
-
- 105 Task
Drop(CancellationToken cancellationToken);
-
- 113 ValueTask<bool>
Migrate(ILogger<DatabaseContext> logger, CancellationToken cancellationToken);
-
-
- 124 ILogger<DatabaseContext> logger,
- 125 Version targetVersion,
-
- 127 CancellationToken cancellationToken);
-
-
+
+
+
+
+ 108 Task
Save(CancellationToken cancellationToken);
+
+ 115 Task
Drop(CancellationToken cancellationToken);
+
+ 123 ValueTask<bool>
Migrate(ILogger<DatabaseContext> logger, CancellationToken cancellationToken);
+
+
+ 134 ILogger<DatabaseContext> logger,
+ 135 Version targetVersion,
+
+ 137 CancellationToken cancellationToken);
+
+
Represents a database table.
IDatabaseCollection< InstancePermissionSet > InstancePermissionSets
The InstancePermissionSets in the IDatabaseContext.
-IDatabaseCollection< PermissionSet > PermissionSets
The DbSet<TEntity> for PermissionSets.
-IDatabaseCollection< ChatChannel > ChatChannels
The ChatChannel in the IDatabaseContext.
+IDatabaseCollection< PermissionSet > PermissionSets
The DbSet<TEntity> for PermissionSets.
+IDatabaseCollection< ChatChannel > ChatChannels
The ChatChannel in the IDatabaseContext.
ValueTask< bool > Migrate(ILogger< DatabaseContext > logger, CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext.
ValueTask SchemaDowngradeForServerVersion(ILogger< DatabaseContext > logger, Version targetVersion, DatabaseType currentDatabaseType, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server targetVersion .
IDatabaseCollection< Job > Jobs
The Jobs in the IDatabaseContext.
IDatabaseCollection< RevisionInformation > RevisionInformations
The RevisionInformations in the IDatabaseContext.
Task Drop(CancellationToken cancellationToken)
Attempts to delete all tables and drop the database in use.
+IDatabaseCollection< TestMerge > TestMerges
The TestMerges in the IDatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext.
-IDatabaseCollection< UserGroup > Groups
The DbSet<TEntity> for UserGroups.
+IDatabaseCollection< UserGroup > Groups
The DbSet<TEntity> for UserGroups.
IDatabaseCollection< User > Users
The Users in the IDatabaseContext.
IDatabaseCollection< CompileJob > CompileJobs
The CompileJobs in the IDatabaseContext.
-IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
-IDatabaseCollection< OAuthConnection > OAuthConnections
The DbSet<TEntity> for OAuthConnections.
-IDatabaseCollection< ChatBot > ChatBots
The ChatBots in the IDatabaseContext.
+IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
+IDatabaseCollection< OAuthConnection > OAuthConnections
The DbSet<TEntity> for OAuthConnections.
+IDatabaseCollection< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges in the IDatabaseContext.
+IDatabaseCollection< ChatBot > ChatBots
The ChatBots in the IDatabaseContext.
IDatabaseCollection< Instance > Instances
The Instances in the IDatabaseContext.
DatabaseType
Type of database to user.
diff --git a/_instance_controller_8cs_source.html b/_instance_controller_8cs_source.html
index 51f6a90881..ec6d4b47f8 100644
--- a/_instance_controller_8cs_source.html
+++ b/_instance_controller_8cs_source.html
@@ -307,507 +307,533 @@ $(function() {
285 if (originalModel.Online!.Value)
-
-
- 290 var originalPath = originalModel.Path!;
-
-
-
-
-
-
- 297 catch (OperationCanceledException)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 322#pragma warning disable CA1502
-
-
- 325 ArgumentNullException.ThrowIfNull(model);
-
-
-
-
-
-
- 332 var moveJob = await InstanceQuery()
- 333 .SelectMany(x => x.Jobs)
- 334 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
- 335 .Select(x =>
new Job(x.Id!.Value))
- 336 .FirstOrDefaultAsync(cancellationToken);
-
-
-
-
-
-
-
-
-
- 346 var originalModel = await InstanceQuery()
- 347 .Include(x => x.RepositorySettings)
- 348 .Include(x => x.ChatSettings)
- 349 .ThenInclude(x => x.Channels)
- 350 .Include(x => x.DreamDaemonSettings)
- 351 .FirstOrDefaultAsync(cancellationToken);
- 352 if (originalModel ==
default(Models.Instance))
-
-
-
-
+ 288 var originalPath = originalModel.Path!;
+
+
+
+
+
+
+ 295 catch (OperationCanceledException)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 309 .Where(x => x.Job!.Instance!.Id ==
id)
+ 310 .ExecuteDeleteAsync(cancellationToken);
+
+
+
+ 314 .Where(x => x.RevisionInformation.InstanceId ==
id)
+ 315 .ExecuteDeleteAsync(cancellationToken);
+
+
+
+ 319 .Where(x => x.InstanceId ==
id)
+ 320 .ExecuteDeleteAsync(cancellationToken);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 348#pragma warning disable CA1502
+
+
+ 351 ArgumentNullException.ThrowIfNull(model);
+
+
+
+
+
-
- 359 bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression,
InstanceManagerRights requiredRight)
-
- 361 var memberSelectorExpression = (MemberExpression)expression.Body;
- 362 var property = (PropertyInfo)memberSelectorExpression.Member;
+ 358 var moveJob = await InstanceQuery()
+ 359 .SelectMany(x => x.Jobs)
+ 360 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+ 361 .Select(x =>
new Job(x.Id!.Value))
+ 362 .FirstOrDefaultAsync(cancellationToken);
- 364 var newVal =
property.GetValue(model);
-
-
- 367 if (!userRights.HasFlag(requiredRight) &&
property.GetValue(originalModel) != newVal)
-
-
- 370 property.SetValue(originalModel, newVal);
-
-
-
- 374 string? originalModelPath =
null;
- 375 string? normalizedPath =
null;
- 376 var originalOnline = originalModel.Online!.Value;
- 377 if (model.Path !=
null)
-
-
+
+
+
+
+
+
+
+
+ 372 var originalModel = await InstanceQuery()
+ 373 .Include(x => x.RepositorySettings)
+ 374 .Include(x => x.ChatSettings)
+ 375 .ThenInclude(x => x.Channels)
+ 376 .Include(x => x.DreamDaemonSettings)
+ 377 .FirstOrDefaultAsync(cancellationToken);
+ 378 if (originalModel ==
default(Models.Instance))
+
- 381 if (normalizedPath != originalModel.Path)
-
-
-
- 385 if (originalOnline && model.Online !=
true)
-
-
-
-
-
-
- 392 originalModelPath = originalModel.Path;
- 393 originalModel.Path = normalizedPath;
-
-
-
- 397 var oldAutoUpdateInterval = originalModel.AutoUpdateInterval!.Value;
- 398 var oldAutoUpdateCron = originalModel.AutoUpdateCron;
+
+
+
+
+ 385 bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression,
InstanceManagerRights requiredRight)
+
+ 387 var memberSelectorExpression = (MemberExpression)expression.Body;
+ 388 var property = (PropertyInfo)memberSelectorExpression.Member;
+
+ 390 var newVal =
property.GetValue(model);
+
+
+ 393 if (!userRights.HasFlag(requiredRight) &&
property.GetValue(originalModel) != newVal)
+
+
+ 396 property.SetValue(originalModel, newVal);
+
+
-
- 401 if (earlyOut !=
null)
-
-
- 404 var changedAutoInterval = model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval;
- 405 var changedAutoCron = model.AutoUpdateCron !=
null && oldAutoUpdateCron != model.AutoUpdateCron;
+ 400 string? originalModelPath =
null;
+ 401 string? normalizedPath =
null;
+ 402 var originalOnline = originalModel.Online!.Value;
+ 403 if (model.Path !=
null)
+
+
- 407 var renamed = model.Name !=
null && originalModel.Name != model.Name;
-
-
-
-
-
-
-
-
-
- 417 if (model.ChatBotLimit.HasValue)
-
-
-
-
- 422 .Where(x => x.InstanceId == originalModel.Id)
- 423 .CountAsync(cancellationToken);
-
- 425 if (countOfExistingChatBots > model.ChatBotLimit.Value)
-
-
-
-
- 430 model.AutoUpdateInterval = 0;
- 431 else if (changedAutoInterval)
- 432 model.AutoUpdateCron = String.Empty;
-
-
-
-
-
-
-
- 440 async componentInstance =>
-
- 442 await componentInstance.InstanceRenamed(originalModel.Name!, cancellationToken);
-
-
-
-
-
- 448 var oldAutoStart = originalModel.DreamDaemonSettings!.AutoStart;
-
-
- 451 if (originalOnline && model.Online ==
false)
-
- 453 else if (!originalOnline && model.Online ==
true)
-
-
-
- 457 originalModel.DreamDaemonSettings.AutoStart =
false;
-
-
-
-
-
- 463 if (e is not OperationCanceledException)
- 464 Logger.LogError(e,
"Error changing instance online state!");
- 465 originalModel.Online = originalOnline;
- 466 originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
- 467 if (originalModelPath !=
null)
- 468 originalModel.Path = originalModelPath;
-
-
-
-
-
-
-
+ 407 if (normalizedPath != originalModel.Path)
+
+
+
+ 411 if (originalOnline && model.Online !=
true)
+
+
+
+
+
+
+ 418 originalModelPath = originalModel.Path;
+ 419 originalModel.Path = normalizedPath;
+
+
+
+ 423 var oldAutoUpdateInterval = originalModel.AutoUpdateInterval!.Value;
+ 424 var oldAutoUpdateCron = originalModel.AutoUpdateCron;
+
+
+ 427 if (earlyOut !=
null)
+
+
+ 430 var changedAutoInterval = model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval;
+ 431 var changedAutoCron = model.AutoUpdateCron !=
null && oldAutoUpdateCron != model.AutoUpdateCron;
+
+ 433 var renamed = model.Name !=
null && originalModel.Name != model.Name;
+
+
+
+
+
+
+
+
+
+ 443 if (model.ChatBotLimit.HasValue)
+
+
+
+
+ 448 .Where(x => x.InstanceId == originalModel.Id)
+ 449 .CountAsync(cancellationToken);
+
+ 451 if (countOfExistingChatBots > model.ChatBotLimit.Value)
+
+
+
+
+ 456 model.AutoUpdateInterval = 0;
+ 457 else if (changedAutoInterval)
+ 458 model.AutoUpdateCron = String.Empty;
+
+
+
+
+
+
+
+ 466 async componentInstance =>
+
+ 468 await componentInstance.InstanceRenamed(originalModel.Name!, cancellationToken);
+
+
+
+
+
+ 474 var oldAutoStart = originalModel.DreamDaemonSettings!.AutoStart;
+
- 477 Id = originalModel.
Id,
-
-
- 480 var moving = originalModelPath !=
null;
-
-
- 483 var description = $
"Move instance ID {originalModel.Id} from {originalModelPath} to {normalizedPath}";
-
- 485 job.Description = description;
-
-
-
- 489 (core, databaseContextFactory, paramJob, progressHandler, ct)
-
-
- 492 api.MoveJob = job.ToApi();
-
-
- 495 if (changedAutoInterval || changedAutoCron)
-
-
-
- 499 async componentInstance =>
-
- 501 await componentInstance.ScheduleAutoUpdate(model.AutoUpdateInterval!.Value, model.AutoUpdateCron);
-
-
-
-
-
-
- 508 return moving ? Accepted(api) : Json(api);
-
- 510#pragma warning restore CA1502
-
-
-
-
- 523 public async ValueTask<IActionResult>
List(
- 524 [FromQuery]
int? page,
- 525 [FromQuery]
int? pageSize,
- 526 CancellationToken cancellationToken)
-
-
-
-
-
-
-
-
-
-
- 537 .Where(x => x.InstancePermissionSets.Any(instanceUser =>
-
-
-
-
-
-
-
-
- 546 return query.Select(x => x);
-
-
- 549 var moveJobs = await GetBaseQuery()
- 550 .SelectMany(x => x.Jobs)
- 551 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
- 552 .Include(x => x.StartedBy!)
- 553 .ThenInclude(x => x.CreatedBy)
- 554 .Include(x => x.Instance)
- 555 .ToListAsync(cancellationToken);
-
- 557 var needsUpdate =
false;
-
- 559 () => ValueTask.FromResult(
-
-
- 562 .OrderBy(x => x.Id))),
-
-
-
- 566 instance.MoveJob = moveJobs.FirstOrDefault(x => x.Instance!.Id == instance.Id)?.ToApi();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 591 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
-
-
-
-
-
-
-
-
-
-
- 602 query = query.Include(x => x.InstancePermissionSets);
-
-
-
- 606 var instance = await QueryForUser().FirstOrDefaultAsync(cancellationToken);
-
- 608 if (instance ==
null)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 624 var api = instance.ToApi();
-
- 626 var moveJob = await QueryForUser()
- 627 .SelectMany(x => x.Jobs)
- 628 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
- 629 .Include(x => x.StartedBy!)
- 630 .ThenInclude(x => x.CreatedBy)
- 631 .Include(x => x.Instance)
- 632 .FirstOrDefaultAsync(cancellationToken);
- 633 api.MoveJob = moveJob?.ToApi();
-
-
-
-
-
-
- 647 [ProducesResponseType(204)]
-
- 649 public async ValueTask<IActionResult>
GrantPermissions(
long id, CancellationToken cancellationToken)
-
-
-
-
-
-
-
- 657 var usersInstancePermissionSet = await BaseQuery()
- 658 .SelectMany(x => x.InstancePermissionSets)
-
- 660 .FirstOrDefaultAsync(cancellationToken);
- 661 if (usersInstancePermissionSet ==
default)
-
-
- 664 var instanceExists = await BaseQuery()
- 665 .AnyAsync(cancellationToken);
-
-
-
-
-
- 671 instanceAdminUser.InstanceId = id;
-
-
-
-
-
-
-
-
-
+ 477 if (originalOnline && model.Online ==
false)
+
+ 479 else if (!originalOnline && model.Online ==
true)
+
+
+
+ 483 originalModel.DreamDaemonSettings.AutoStart =
false;
+
+
+
+
+
+ 489 if (e is not OperationCanceledException)
+ 490 Logger.LogError(e,
"Error changing instance online state!");
+ 491 originalModel.Online = originalOnline;
+ 492 originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
+ 493 if (originalModelPath !=
null)
+ 494 originalModel.Path = originalModelPath;
+
+
+
+
+
+
+
+
+ 503 Id = originalModel.
Id,
+
+
+ 506 var moving = originalModelPath !=
null;
+
+
+ 509 var description = $
"Move instance ID {originalModel.Id} from {originalModelPath} to {normalizedPath}";
+
+ 511 job.Description = description;
+
+
+
+ 515 (core, databaseContextFactory, paramJob, progressHandler, ct)
+
+
+ 518 api.MoveJob = job.ToApi();
+
+
+ 521 if (changedAutoInterval || changedAutoCron)
+
+
+
+ 525 async componentInstance =>
+
+ 527 await componentInstance.ScheduleAutoUpdate(model.AutoUpdateInterval!.Value, model.AutoUpdateCron);
+
+
+
+
+
+
+ 534 return moving ? Accepted(api) : Json(api);
+
+ 536#pragma warning restore CA1502
+
+
+
+
+ 549 public async ValueTask<IActionResult>
List(
+ 550 [FromQuery]
int? page,
+ 551 [FromQuery]
int? pageSize,
+ 552 CancellationToken cancellationToken)
+
+
+
+
+
+
+
+
+
+
+ 563 .Where(x => x.InstancePermissionSets.Any(instanceUser =>
+
+
+
+
+
+
+
+
+ 572 return query.Select(x => x);
+
+
+ 575 var moveJobs = await GetBaseQuery()
+ 576 .SelectMany(x => x.Jobs)
+ 577 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+ 578 .Include(x => x.StartedBy!)
+ 579 .ThenInclude(x => x.CreatedBy)
+ 580 .Include(x => x.Instance)
+ 581 .ToListAsync(cancellationToken);
+
+ 583 var needsUpdate =
false;
+
+ 585 () => ValueTask.FromResult(
+
+
+ 588 .OrderBy(x => x.Id))),
+
+
+
+ 592 instance.MoveJob = moveJobs.FirstOrDefault(x => x.Instance!.Id == instance.Id)?.ToApi();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 617 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
+
+
+
+
+
+
+
+
+
+
+ 628 query = query.Include(x => x.InstancePermissionSets);
+
+
+
+ 632 var instance = await QueryForUser().FirstOrDefaultAsync(cancellationToken);
+
+ 634 if (instance ==
null)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 650 var api = instance.ToApi();
+
+ 652 var moveJob = await QueryForUser()
+ 653 .SelectMany(x => x.Jobs)
+ 654 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+ 655 .Include(x => x.StartedBy!)
+ 656 .ThenInclude(x => x.CreatedBy)
+ 657 .Include(x => x.Instance)
+ 658 .FirstOrDefaultAsync(cancellationToken);
+ 659 api.MoveJob = moveJob?.ToApi();
+
+
+
+
+
+
+ 673 [ProducesResponseType(204)]
+
+ 675 public async ValueTask<IActionResult>
GrantPermissions(
long id, CancellationToken cancellationToken)
+
+
+
+
+
-
-
-
- 691 if (!ddPort.HasValue)
-
-
-
- 695 const ushort DefaultDreamDaemonPort = 1337;
- 696 if (ddPort.Value < DefaultDreamDaemonPort)
-
-
- 699 const ushort DefaultApiValidationPort = 1339;
-
-
- 702 Math.Min((ushort)(ddPort.Value + 1), DefaultApiValidationPort),
-
-
- 705 if (!dmPort.HasValue)
-
+
+ 683 var usersInstancePermissionSet = await BaseQuery()
+ 684 .SelectMany(x => x.InstancePermissionSets)
+
+ 686 .FirstOrDefaultAsync(cancellationToken);
+ 687 if (usersInstancePermissionSet ==
default)
+
+
+ 690 var instanceExists = await BaseQuery()
+ 691 .AnyAsync(cancellationToken);
+
+
+
+
+
+ 697 instanceAdminUser.InstanceId = id;
+
+
+
+
+
+
+
+
+
-
- 709 if (dmPort < DefaultApiValidationPort)
-
-
-
-
-
-
-
- 717 AllowWebClient =
false,
-
-
- 720 OpenDreamTopicPort = 0,
-
-
-
- 724 HealthCheckSeconds = 60,
- 725 DumpOnHealthCheckRestart =
false,
-
- 727 AdditionalParameters = String.Empty,
- 728 StartProfiler =
false,
-
-
-
-
-
-
- 735 ApiValidationPort = dmPort,
-
- 737 RequireDMApiValidation =
true,
- 738 Timeout = TimeSpan.FromHours(1),
- 739 CompilerAdditionalArguments =
null,
-
- 741 Name = initialSettings.
Name,
-
- 743 Path = initialSettings.
Path,
- 744 AutoUpdateInterval = initialSettings.AutoUpdateInterval ?? 0,
- 745 AutoUpdateCron = initialSettings.AutoUpdateCron ?? String.Empty,
- 746 ChatBotLimit = initialSettings.ChatBotLimit ?? Models.Instance.DefaultChatBotLimit,
-
-
- 749 CommitterEmail = Components.Repository.Repository.DefaultCommitterEmail,
- 750 CommitterName = Components.Repository.Repository.DefaultCommitterName,
- 751 PushTestMergeCommits =
false,
- 752 ShowTestMergeCommitters =
false,
- 753 AutoUpdatesKeepTestMerges =
false,
- 754 AutoUpdatesSynchronize =
false,
- 755 PostTestMergeComment =
false,
- 756 CreateGitHubDeployments =
false,
- 757 UpdateSubmodules =
true,
+
+
+
+ 717 if (!ddPort.HasValue)
+
+
+
+ 721 const ushort DefaultDreamDaemonPort = 1337;
+ 722 if (ddPort.Value < DefaultDreamDaemonPort)
+
+
+ 725 const ushort DefaultApiValidationPort = 1339;
+
+
+ 728 Math.Min((ushort)(ddPort.Value + 1), DefaultApiValidationPort),
+
+
+ 731 if (!dmPort.HasValue)
+
+
+
+ 735 if (dmPort < DefaultApiValidationPort)
+
+
+
+
+
+
+
+ 743 AllowWebClient =
false,
+
+
+ 746 OpenDreamTopicPort = 0,
+
+
+
+ 750 HealthCheckSeconds = 60,
+ 751 DumpOnHealthCheckRestart =
false,
+
+ 753 AdditionalParameters = String.Empty,
+ 754 StartProfiler =
false,
+
+
+
- 759 InstancePermissionSets =
new List<InstancePermissionSet>
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 786 return permissionSetToModify;
-
-
- 794 [
return: NotNullIfNotNull(nameof(path))]
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 818 .AnyAsync(cancellationToken);
-
-
-
-
- 828 if (!String.IsNullOrWhiteSpace(instance.AutoUpdateCron))
-
- 830 if ((instance.AutoUpdateInterval.HasValue && instance.AutoUpdateInterval.Value != 0)
- 831 || (CrontabSchedule.TryParse(
- 832 instance.AutoUpdateCron,
- 833 new CrontabSchedule.ParseOptions
-
- 835 IncludingSeconds = true,
-
-
-
- 839 instance.AutoUpdateInterval = 0;
-
-
- 842 instance.AutoUpdateCron = String.Empty;
-
-
+ 761 ApiValidationPort = dmPort,
+
+ 763 RequireDMApiValidation =
true,
+ 764 Timeout = TimeSpan.FromHours(1),
+ 765 CompilerAdditionalArguments =
null,
+
+ 767 Name = initialSettings.
Name,
+
+ 769 Path = initialSettings.
Path,
+ 770 AutoUpdateInterval = initialSettings.AutoUpdateInterval ?? 0,
+ 771 AutoUpdateCron = initialSettings.AutoUpdateCron ?? String.Empty,
+ 772 ChatBotLimit = initialSettings.ChatBotLimit ?? Models.Instance.DefaultChatBotLimit,
+
+
+ 775 CommitterEmail = Components.Repository.Repository.DefaultCommitterEmail,
+ 776 CommitterName = Components.Repository.Repository.DefaultCommitterName,
+ 777 PushTestMergeCommits =
false,
+ 778 ShowTestMergeCommitters =
false,
+ 779 AutoUpdatesKeepTestMerges =
false,
+ 780 AutoUpdatesSynchronize =
false,
+ 781 PostTestMergeComment =
false,
+ 782 CreateGitHubDeployments =
false,
+ 783 UpdateSubmodules =
true,
+
+ 785 InstancePermissionSets =
new List<InstancePermissionSet>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 812 return permissionSetToModify;
+
+
+ 820 [
return: NotNullIfNotNull(nameof(path))]
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 844 .AnyAsync(cancellationToken);
-
-
+
+
+
+ 854 if (!String.IsNullOrWhiteSpace(instance.AutoUpdateCron))
+
+ 856 if ((instance.AutoUpdateInterval.HasValue && instance.AutoUpdateInterval.Value != 0)
+ 857 || (CrontabSchedule.TryParse(
+ 858 instance.AutoUpdateCron,
+ 859 new CrontabSchedule.ParseOptions
+
+ 861 IncludingSeconds = true,
+
+
+
+ 865 instance.AutoUpdateInterval = 0;
+
+
+ 868 instance.AutoUpdateCron = String.Empty;
+
+
+
+
+
virtual ? long Id
The ID of the entity.
@@ -840,32 +866,35 @@ $(function() {
readonly IInstanceManager instanceManager
The IInstanceManager for the ComponentInterfacingController.
bool ValidateInstanceOnlineStatus(Api.Models.Instance metadata)
Corrects discrepencies between the Api.Models.Instance.Online status of IInstances in the database vs...
ApiController for managing Components.Instances.
-async ValueTask< Models.Instance?> CreateDefaultInstance(InstanceCreateRequest initialSettings, CancellationToken cancellationToken)
Creates a default Models.Instance from initialSettings .
-async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific Api.Models.Instance.
+async ValueTask< Models.Instance?> CreateDefaultInstance(InstanceCreateRequest initialSettings, CancellationToken cancellationToken)
Creates a default Models.Instance from initialSettings .
+async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Get a specific Api.Models.Instance.
InstanceController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, ILogger< InstanceController > logger, IInstanceManager instanceManager, IJobManager jobManager, IIOManager ioManager, IPlatformIdentifier platformIdentifier, IPortAllocator portAllocator, IPermissionsUpdateNotifyee permissionsUpdateNotifyee, IOptions< GeneralConfiguration > generalConfigurationOptions, IOptions< SwarmConfiguration > swarmConfigurationOptions, IApiHeadersProvider apiHeaders)
Initializes a new instance of the InstanceController class.
readonly IJobManager jobManager
The IJobManager for the InstanceController.
readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the InstanceController.
-BadRequestObjectResult? ValidateCronSetting(Api.Models.Instance instance)
Validates a given instance 's Api.Models.Instance.AutoUpdateCron setting.
-string? NormalizePath(string? path)
Normalize a given path for an instance.
+BadRequestObjectResult? ValidateCronSetting(Api.Models.Instance instance)
Validates a given instance 's Api.Models.Instance.AutoUpdateCron setting.
+string? NormalizePath(string? path)
Normalize a given path for an instance.
readonly IPortAllocator portAllocator
The IPortAllocator for the InstanceController.
-async ValueTask< IActionResult > Update([FromBody] InstanceUpdateRequest model, CancellationToken cancellationToken)
Modify an Api.Models.Instance's settings.
-InstancePermissionSet InstanceAdminPermissionSet(InstancePermissionSet? permissionSetToModify)
Generate an InstancePermissionSet with full rights.
+async ValueTask< IActionResult > Update([FromBody] InstanceUpdateRequest model, CancellationToken cancellationToken)
Modify an Api.Models.Instance's settings.
+InstancePermissionSet InstanceAdminPermissionSet(InstancePermissionSet? permissionSetToModify)
Generate an InstancePermissionSet with full rights.
readonly SwarmConfiguration swarmConfiguration
The SwarmConfiguration for the InstanceController.
-async ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List Api.Models.Instances.
+async ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List Api.Models.Instances.
const string InstanceAttachFileName
File name to allow attaching instances.
async ValueTask< IActionResult > Create([FromBody] InstanceCreateRequest model, CancellationToken cancellationToken)
Create or attach an Api.Models.Instance.
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController.
readonly IPermissionsUpdateNotifyee permissionsUpdateNotifyee
The IPermissionsUpdateNotifyee for the InstanceController.
async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Detach an Api.Models.Instance with the given id .
-async ValueTask CheckAccessible(InstanceResponse instanceResponse, CancellationToken cancellationToken)
Populate the InstanceResponse.Accessible property of a given instanceResponse .
+async ValueTask CheckAccessible(InstanceResponse instanceResponse, CancellationToken cancellationToken)
Populate the InstanceResponse.Accessible property of a given instanceResponse .
readonly IIOManager ioManager
The IIOManager for the InstanceController.
-async ValueTask< IActionResult > GrantPermissions(long id, CancellationToken cancellationToken)
Gives the current user full permissions on a given instance id .
+async ValueTask< IActionResult > GrantPermissions(long id, CancellationToken cancellationToken)
Gives the current user full permissions on a given instance id .
Helper for returning paginated models.
Backend abstract implementation of IDatabaseContext.
DbSet< Instance > Instances
The Instances in the DatabaseContext.
DbSet< InstancePermissionSet > InstancePermissionSets
The InstancePermissionSets in the DatabaseContext.
+DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext.
+DbSet< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges in the DatabaseContext.
+DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the DatabaseContext.
IIOManager that resolves paths to Environment.CurrentDirectory.
const string CurrentDirectory
Path to the current working directory for the IIOManager.
diff --git a/_instance_factory_8cs_source.html b/_instance_factory_8cs_source.html
index 1bb7928be9..aeec13b1f7 100644
--- a/_instance_factory_8cs_source.html
+++ b/_instance_factory_8cs_source.html
@@ -426,7 +426,7 @@ $(function() {
async ValueTask DisposeAsync()
-
+
General configuration options.
Configuration options for the game sessions.
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
diff --git a/_instance_permission_set_controller_8cs_source.html b/_instance_permission_set_controller_8cs_source.html
index f7f14e2c3e..1fe04310bb 100644
--- a/_instance_permission_set_controller_8cs_source.html
+++ b/_instance_permission_set_controller_8cs_source.html
@@ -100,191 +100,189 @@ $(function() {
- 23using Z.EntityFramework.Plus;
-
-
-
-
-
-
-
-
-
-
-
- 50 ILogger<InstancePermissionSetController> logger,
-
-
-
-
-
- 56 authenticationContext,
-
-
-
-
-
-
-
-
-
-
-
- 76#pragma warning disable CA1506
-
-
- 79 ArgumentNullException.ThrowIfNull(model);
-
-
-
-
- 84 .Where(x => x.Id == model.PermissionSetId)
- 85 .Select(x =>
new Models.PermissionSet
-
-
-
-
- 90 .FirstOrDefaultAsync(cancellationToken);
-
- 92 if (existingPermissionSet ==
default)
-
-
- 95 if (existingPermissionSet.UserId.HasValue)
-
-
-
-
- 100 .Where(x => x.Id == existingPermissionSet.UserId.Value)
- 101 .Select(x => x.CanonicalName)
- 102 .FirstAsync(cancellationToken);
-
- 104 if (userCanonicalName == Models.User.CanonicalizeName(Models.User.TgsSystemUserName))
-
-
-
-
-
-
-
-
-
-
-
-
- 117 PermissionSetId = model.PermissionSetId,
- 118 InstanceId =
Instance.Require(x => x.Id),
-
+
+
+
+
+
+
+
+
+
+
+ 48 ILogger<InstancePermissionSetController> logger,
+
+
+
+
+
+ 54 authenticationContext,
+
+
+
+
+
+
+
+
+
+
+
+ 74#pragma warning disable CA1506
+
+
+ 77 ArgumentNullException.ThrowIfNull(model);
+
+
+
+
+ 82 .Where(x => x.Id == model.PermissionSetId)
+ 83 .Select(x =>
new Models.PermissionSet
+
+
+
+
+ 88 .FirstOrDefaultAsync(cancellationToken);
+
+ 90 if (existingPermissionSet ==
default)
+
+
+ 93 if (existingPermissionSet.UserId.HasValue)
+
+
+
+
+ 98 .Where(x => x.Id == existingPermissionSet.UserId.Value)
+ 99 .Select(x => x.CanonicalName)
+ 100 .FirstAsync(cancellationToken);
+
+ 102 if (userCanonicalName == Models.User.CanonicalizeName(Models.User.TgsSystemUserName))
+
+
+
+
+
+
+
+
+
+
+
+
+ 115 PermissionSetId = model.PermissionSetId,
+ 116 InstanceId =
Instance.Require(x => x.Id),
+
+
+
-
+
-
-
-
- 126 dbUser.PermissionSet = existingPermissionSet;
-
- 128 return Created(dbUser.ToApi());
-
- 130#pragma warning restore CA1506
-
-
-
-
-
- 144#pragma warning disable CA1506
-
-
- 147 ArgumentNullException.ThrowIfNull(model);
-
-
-
-
-
- 153 .SelectMany(x => x.InstancePermissionSets)
- 154 .Where(x => x.PermissionSetId == model.PermissionSetId)
- 155 .FirstOrDefaultAsync(cancellationToken);
- 156 if (originalPermissionSet ==
null)
-
-
- 159 originalPermissionSet.EngineRights =
RightsHelper.Clamp(model.EngineRights ?? originalPermissionSet.EngineRights!.Value);
- 160 originalPermissionSet.RepositoryRights =
RightsHelper.Clamp(model.RepositoryRights ?? originalPermissionSet.RepositoryRights!.Value);
- 161 originalPermissionSet.InstancePermissionSetRights =
RightsHelper.Clamp(model.InstancePermissionSetRights ?? originalPermissionSet.InstancePermissionSetRights!.Value);
- 162 originalPermissionSet.ChatBotRights =
RightsHelper.Clamp(model.ChatBotRights ?? originalPermissionSet.ChatBotRights!.Value);
- 163 originalPermissionSet.ConfigurationRights =
RightsHelper.Clamp(model.ConfigurationRights ?? originalPermissionSet.ConfigurationRights!.Value);
- 164 originalPermissionSet.DreamDaemonRights =
RightsHelper.Clamp(model.DreamDaemonRights ?? originalPermissionSet.DreamDaemonRights!.Value);
- 165 originalPermissionSet.DreamMakerRights =
RightsHelper.Clamp(model.DreamMakerRights ?? originalPermissionSet.DreamMakerRights!.Value);
-
-
-
-
-
- 171 showFullPermissionSet
- 172 ? originalPermissionSet.ToApi()
-
-
- 175 PermissionSetId = originalPermissionSet.PermissionSetId,
-
-
- 178#pragma warning restore CA1506
-
-
-
-
-
-
-
-
- 200 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
- 201 => Paginated<InstancePermissionSet, InstancePermissionSetResponse>(
- 202 () => ValueTask.FromResult(
-
-
-
-
-
- 208 .SelectMany(x => x.InstancePermissionSets)
- 209 .OrderBy(x => x.PermissionSetId))),
-
-
-
-
-
-
-
-
-
- 227 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
-
-
-
-
-
-
- 234 .SelectMany(x => x.InstancePermissionSets)
- 235 .Where(x => x.PermissionSetId ==
id)
- 236 .FirstOrDefaultAsync(cancellationToken);
- 237 if (permissionSet ==
default)
-
- 239 return Json(permissionSet.ToApi());
-
-
-
-
- 252 [ProducesResponseType(204)]
-
- 254 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
-
-
-
-
-
- 260 .SelectMany(x => x.InstancePermissionSets)
- 261 .Where(x => x.PermissionSetId ==
id)
- 262 .DeleteAsync(cancellationToken);
-
- 264 return numDeleted > 0 ? NoContent() : this.Gone();
-
-
-
+
+ 124 dbUser.PermissionSet = existingPermissionSet;
+
+ 126 return Created(dbUser.ToApi());
+
+ 128#pragma warning restore CA1506
+
+
+
+
+
+ 142#pragma warning disable CA1506
+
+
+ 145 ArgumentNullException.ThrowIfNull(model);
+
+
+
+
+
+ 151 .SelectMany(x => x.InstancePermissionSets)
+ 152 .Where(x => x.PermissionSetId == model.PermissionSetId)
+ 153 .FirstOrDefaultAsync(cancellationToken);
+ 154 if (originalPermissionSet ==
null)
+
+
+ 157 originalPermissionSet.EngineRights =
RightsHelper.Clamp(model.EngineRights ?? originalPermissionSet.EngineRights!.Value);
+ 158 originalPermissionSet.RepositoryRights =
RightsHelper.Clamp(model.RepositoryRights ?? originalPermissionSet.RepositoryRights!.Value);
+ 159 originalPermissionSet.InstancePermissionSetRights =
RightsHelper.Clamp(model.InstancePermissionSetRights ?? originalPermissionSet.InstancePermissionSetRights!.Value);
+ 160 originalPermissionSet.ChatBotRights =
RightsHelper.Clamp(model.ChatBotRights ?? originalPermissionSet.ChatBotRights!.Value);
+ 161 originalPermissionSet.ConfigurationRights =
RightsHelper.Clamp(model.ConfigurationRights ?? originalPermissionSet.ConfigurationRights!.Value);
+ 162 originalPermissionSet.DreamDaemonRights =
RightsHelper.Clamp(model.DreamDaemonRights ?? originalPermissionSet.DreamDaemonRights!.Value);
+ 163 originalPermissionSet.DreamMakerRights =
RightsHelper.Clamp(model.DreamMakerRights ?? originalPermissionSet.DreamMakerRights!.Value);
+
+
+
+
+
+ 169 showFullPermissionSet
+ 170 ? originalPermissionSet.ToApi()
+
+
+ 173 PermissionSetId = originalPermissionSet.PermissionSetId,
+
+
+ 176#pragma warning restore CA1506
+
+
+
+
+
+
+
+
+ 198 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
+ 199 => Paginated<InstancePermissionSet, InstancePermissionSetResponse>(
+ 200 () => ValueTask.FromResult(
+
+
+
+
+
+ 206 .SelectMany(x => x.InstancePermissionSets)
+ 207 .OrderBy(x => x.PermissionSetId))),
+
+
+
+
+
+
+
+
+
+ 225 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
+
+
+
+
+
+
+ 232 .SelectMany(x => x.InstancePermissionSets)
+ 233 .Where(x => x.PermissionSetId ==
id)
+ 234 .FirstOrDefaultAsync(cancellationToken);
+ 235 if (permissionSet ==
default)
+
+ 237 return Json(permissionSet.ToApi());
+
+
+
+
+ 250 [ProducesResponseType(204)]
+
+ 252 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
+
+
+
+
+
+ 258 .SelectMany(x => x.InstancePermissionSets)
+ 259 .Where(x => x.PermissionSetId ==
id)
+ 260 .ExecuteDeleteAsync(cancellationToken);
+
+ 262 return numDeleted > 0 ? NoContent() : this.Gone();
+
+
+
virtual ? long Id
The ID of the entity.
Metadata about a server instance.
A request to update an instance permission set.
@@ -297,15 +295,15 @@ $(function() {
const string InstancePermissionSet
The instance permission set controller.
ObjectResult Created(object payload)
Generic 201 response with a given payload .
readonly IInstanceManager instanceManager
The IInstanceManager for the ComponentInterfacingController.
-ApiController for managing InstancePermissionSets.
-async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Gets a specific Api.Models.Internal.InstancePermissionSet.
+ApiController for managing InstancePermissionSets.
+async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Gets a specific Api.Models.Internal.InstancePermissionSet.
ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
Lists InstancePermissionSets for the instance.
IActionResult Read()
Read the active InstancePermissionSet.
-readonly IPermissionsUpdateNotifyee permissionsUpdateNotifyee
The IPermissionsUpdateNotifyee for the InstancePermissionSetController.
-async ValueTask< IActionResult > Update([FromBody] InstancePermissionSetRequest model, CancellationToken cancellationToken)
Update the permissions for an InstancePermissionSet.
-InstancePermissionSetController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, ILogger< InstancePermissionSetController > logger, IInstanceManager instanceManager, IPermissionsUpdateNotifyee permissionsUpdateNotifyee, IApiHeadersProvider apiHeaders)
Initializes a new instance of the InstancePermissionSetController class.
-async ValueTask< IActionResult > Create([FromBody] InstancePermissionSetRequest model, CancellationToken cancellationToken)
Create an InstancePermissionSet.
-async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete an InstancePermissionSet.
+readonly IPermissionsUpdateNotifyee permissionsUpdateNotifyee
The IPermissionsUpdateNotifyee for the InstancePermissionSetController.
+async ValueTask< IActionResult > Update([FromBody] InstancePermissionSetRequest model, CancellationToken cancellationToken)
Update the permissions for an InstancePermissionSet.
+InstancePermissionSetController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, ILogger< InstancePermissionSetController > logger, IInstanceManager instanceManager, IPermissionsUpdateNotifyee permissionsUpdateNotifyee, IApiHeadersProvider apiHeaders)
Initializes a new instance of the InstancePermissionSetController class.
+async ValueTask< IActionResult > Create([FromBody] InstancePermissionSetRequest model, CancellationToken cancellationToken)
Create an InstancePermissionSet.
+async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete an InstancePermissionSet.
ComponentInterfacingController for operations that require an instance.
Helper for returning paginated models.
Backend abstract implementation of IDatabaseContext.
diff --git a/_port_allocator_8cs_source.html b/_port_allocator_8cs_source.html
index 115faa040e..78b335bd7f 100644
--- a/_port_allocator_8cs_source.html
+++ b/_port_allocator_8cs_source.html
@@ -259,8 +259,8 @@ $(function() {
Factory for scoping usage of IDatabaseContexts. Meant for use by Components.
ValueTask UseContext(Func< IDatabaseContext, ValueTask > operation)
Run an operation in the scope of an IDatabaseContext.
-IDatabaseCollection< DreamDaemonSettings > DreamDaemonSettings
The Models.DreamDaemonSettings in the IDatabaseContext.
-IDatabaseCollection< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the IDatabaseContext.
+IDatabaseCollection< DreamDaemonSettings > DreamDaemonSettings
The Models.DreamDaemonSettings in the IDatabaseContext.
+IDatabaseCollection< DreamMakerSettings > DreamMakerSettings
The Models.DreamMakerSettings in the IDatabaseContext.
Gets unassigned ports for use by TGS.
diff --git a/_session_persistor_8cs_source.html b/_session_persistor_8cs_source.html
index 3e7c0273c9..0a40e9542d 100644
--- a/_session_persistor_8cs_source.html
+++ b/_session_persistor_8cs_source.html
@@ -91,256 +91,254 @@ $(function() {
- 14using Z.EntityFramework.Plus;
-
-
-
-
-
-
-
-
-
-
-
- 39 readonly ILogger<SessionPersistor>
logger;
-
-
-
-
-
-
-
- 58 ILogger<SessionPersistor>
logger,
-
-
-
-
-
- 64 this.logger =
logger ??
throw new ArgumentNullException(nameof(
logger));
- 65 this.metadata =
metadata ??
throw new ArgumentNullException(nameof(
metadata));
-
-
-
-
- 71 ArgumentNullException.ThrowIfNull(reattachInformation);
+
+
+
+
+
+
+
+
+
+
+ 37 readonly ILogger<SessionPersistor>
logger;
+
+
+
+
+
+
+
+ 56 ILogger<SessionPersistor>
logger,
+
+
+
+
+
+ 62 this.logger =
logger ??
throw new ArgumentNullException(nameof(
logger));
+ 63 this.metadata =
metadata ??
throw new ArgumentNullException(nameof(
metadata));
+
+
+
+
+ 69 ArgumentNullException.ThrowIfNull(reattachInformation);
+
+ 71 logger.LogTrace(
"Saving reattach information: {info}...", reattachInformation);
- 73 logger.LogTrace(
"Saving reattach information: {info}...", reattachInformation);
+ 73 await
ClearImpl(db,
false, cancellationToken);
- 75 await
ClearImpl(db,
false, cancellationToken);
-
- 77 var dbReattachInfo =
new Models.ReattachInformation(reattachInformation.AccessIdentifier)
-
- 79 CompileJobId = reattachInformation.Dmb.CompileJob.Require(x => x.Id),
- 80 InitialCompileJobId = reattachInformation.InitialDmb?.CompileJob.Require(x => x.Id),
- 81 Port = reattachInformation.Port,
- 82 ProcessId = reattachInformation.ProcessId,
-
- 84 LaunchSecurityLevel = reattachInformation.LaunchSecurityLevel,
- 85 LaunchVisibility = reattachInformation.LaunchVisibility,
- 86 TopicPort = reattachInformation.TopicPort,
-
-
- 89 db.ReattachInformations.Add(dbReattachInfo);
- 90 await db.Save(cancellationToken);
-
- 92 reattachInformation.Id = dbReattachInfo.Id!.Value;
- 93 logger.LogDebug(
"Saved reattach information: {info}", reattachInformation);
-
-
-
-
- 99 ArgumentNullException.ThrowIfNull(reattachInformation);
- 100 if (!reattachInformation.Id.HasValue)
- 101 throw new InvalidOperationException(
"Provided reattachInformation has no Id!");
+ 75 var dbReattachInfo =
new Models.ReattachInformation(reattachInformation.AccessIdentifier)
+
+ 77 CompileJobId = reattachInformation.Dmb.CompileJob.Require(x => x.Id),
+ 78 InitialCompileJobId = reattachInformation.InitialDmb?.CompileJob.Require(x => x.Id),
+ 79 Port = reattachInformation.Port,
+ 80 ProcessId = reattachInformation.ProcessId,
+
+ 82 LaunchSecurityLevel = reattachInformation.LaunchSecurityLevel,
+ 83 LaunchVisibility = reattachInformation.LaunchVisibility,
+ 84 TopicPort = reattachInformation.TopicPort,
+
+
+ 87 db.ReattachInformations.Add(dbReattachInfo);
+ 88 await db.Save(cancellationToken);
+
+ 90 reattachInformation.Id = dbReattachInfo.Id!.Value;
+ 91 logger.LogDebug(
"Saved reattach information: {info}", reattachInformation);
+
+
+
+
+ 97 ArgumentNullException.ThrowIfNull(reattachInformation);
+ 98 if (!reattachInformation.Id.HasValue)
+ 99 throw new InvalidOperationException(
"Provided reattachInformation has no Id!");
+
+ 101 logger.LogTrace(
"Updating reattach information: {info}...", reattachInformation);
- 103 logger.LogTrace(
"Updating reattach information: {info}...", reattachInformation);
-
- 105 var dbReattachInfo =
new Models.ReattachInformation(String.Empty)
-
- 107 Id = reattachInformation.Id.Value,
-
+ 103 var dbReattachInfo =
new Models.ReattachInformation(String.Empty)
+
+ 105 Id = reattachInformation.Id.Value,
+
+
+ 108 db.ReattachInformations.Attach(dbReattachInfo);
- 110 db.ReattachInformations.Attach(dbReattachInfo);
-
- 112 dbReattachInfo.AccessIdentifier = reattachInformation.AccessIdentifier;
- 113 dbReattachInfo.CompileJobId = reattachInformation.Dmb.CompileJob.Require(x => x.Id);
- 114 dbReattachInfo.InitialCompileJobId = reattachInformation.InitialDmb?.CompileJob.Require(x => x.Id);
- 115 dbReattachInfo.Port = reattachInformation.Port;
- 116 dbReattachInfo.ProcessId = reattachInformation.ProcessId;
- 117 dbReattachInfo.RebootState = reattachInformation.RebootState;
- 118 dbReattachInfo.LaunchSecurityLevel = reattachInformation.LaunchSecurityLevel;
- 119 dbReattachInfo.LaunchVisibility = reattachInformation.LaunchVisibility;
- 120 dbReattachInfo.TopicPort = reattachInformation.TopicPort;
+ 110 dbReattachInfo.AccessIdentifier = reattachInformation.AccessIdentifier;
+ 111 dbReattachInfo.CompileJobId = reattachInformation.Dmb.CompileJob.Require(x => x.Id);
+ 112 dbReattachInfo.InitialCompileJobId = reattachInformation.InitialDmb?.CompileJob.Require(x => x.Id);
+ 113 dbReattachInfo.Port = reattachInformation.Port;
+ 114 dbReattachInfo.ProcessId = reattachInformation.ProcessId;
+ 115 dbReattachInfo.RebootState = reattachInformation.RebootState;
+ 116 dbReattachInfo.LaunchSecurityLevel = reattachInformation.LaunchSecurityLevel;
+ 117 dbReattachInfo.LaunchVisibility = reattachInformation.LaunchVisibility;
+ 118 dbReattachInfo.TopicPort = reattachInformation.TopicPort;
+
+ 120 await db.Save(cancellationToken);
- 122 await db.Save(cancellationToken);
-
- 124 logger.LogDebug(
"Updated reattach information: {info}", reattachInformation);
-
-
- 128 public async ValueTask<ReattachInformation?>
Load(CancellationToken cancellationToken)
-
- 130 Models.ReattachInformation? result =
null;
- 131 TimeSpan? topicTimeout =
null;
-
- 133 async ValueTask KillProcess(Models.ReattachInformation reattachInfo)
-
-
-
-
-
-
- 140 if (reattachInfo == result)
-
- 142 logger.LogWarning(
"Killing PID {pid} associated with CompileJob-less reattach information...", reattachInfo.ProcessId);
-
-
-
- 146 logger.LogWarning(
"Killing PID {pid} associated with extra reattach information...", reattachInfo.ProcessId);
-
-
-
- 150 await process.Lifetime;
-
-
-
-
- 155 logger.LogWarning(ex,
"Failed to kill process!");
-
-
-
-
-
- 161 var dbReattachInfos = await db
- 162 .ReattachInformations
-
- 164 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id)
- 165 .Include(x => x.CompileJob)
- 166 .Include(x => x.InitialCompileJob)
- 167 .ToListAsync(cancellationToken);
- 168 result = dbReattachInfos.FirstOrDefault();
-
-
-
- 172 var timeoutMilliseconds = await db
-
-
-
- 176 .Select(x => x.DreamDaemonSettings!.TopicRequestTimeout)
- 177 .FirstOrDefaultAsync(cancellationToken);
-
- 179 if (timeoutMilliseconds ==
default)
-
- 181 logger.LogCritical(
"Missing TopicRequestTimeout!");
-
-
+ 122 logger.LogDebug(
"Updated reattach information: {info}", reattachInformation);
+
+
+ 126 public async ValueTask<ReattachInformation?>
Load(CancellationToken cancellationToken)
+
+ 128 Models.ReattachInformation? result =
null;
+ 129 TimeSpan? topicTimeout =
null;
+
+ 131 async ValueTask KillProcess(Models.ReattachInformation reattachInfo)
+
+
+
+
+
+
+ 138 if (reattachInfo == result)
+
+ 140 logger.LogWarning(
"Killing PID {pid} associated with CompileJob-less reattach information...", reattachInfo.ProcessId);
+
+
+
+ 144 logger.LogWarning(
"Killing PID {pid} associated with extra reattach information...", reattachInfo.ProcessId);
+
+
+
+ 148 await process.Lifetime;
+
+
+
+
+ 153 logger.LogWarning(ex,
"Failed to kill process!");
+
+
+
+
+
+ 159 var dbReattachInfos = await db
+ 160 .ReattachInformations
+
+ 162 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id)
+ 163 .Include(x => x.CompileJob)
+ 164 .Include(x => x.InitialCompileJob)
+ 165 .ToListAsync(cancellationToken);
+ 166 result = dbReattachInfos.FirstOrDefault();
+
+
+
+ 170 var timeoutMilliseconds = await db
+
+
+
+ 174 .Select(x => x.DreamDaemonSettings!.TopicRequestTimeout)
+ 175 .FirstOrDefaultAsync(cancellationToken);
+
+ 177 if (timeoutMilliseconds ==
default)
+
+ 179 logger.LogCritical(
"Missing TopicRequestTimeout!");
+
+
+
+ 183 topicTimeout = TimeSpan.FromMilliseconds(timeoutMilliseconds.Value);
- 185 topicTimeout = TimeSpan.FromMilliseconds(timeoutMilliseconds.Value);
-
-
- 188 foreach (var reattachInfo in dbReattachInfos)
-
-
-
-
-
-
+
+ 186 foreach (var reattachInfo in dbReattachInfos)
+
+
+
+
+
+
+
+ 194 await KillProcess(reattachInfo);
- 196 await KillProcess(reattachInfo);
-
- 198 db.ReattachInformations.Remove(reattachInfo);
- 199 logger.LogTrace(
"Deleting ReattachInformation {id}...", reattachInfo.Id);
-
-
- 202 await db.Save(cancellationToken);
-
-
- 205 if (!topicTimeout.HasValue)
-
- 207 logger.LogDebug(
"Reattach information not found!");
-
-
-
-
-
-
- 214 logger.LogError(
"Unable to reattach! Could not load .dmb!");
- 215 await KillProcess(result);
-
-
-
- 219 logger.LogTrace(
"Deleting ReattachInformation {id}...", result.Id);
-
- 221 .ReattachInformations
-
- 223 .Where(x => x.Id == result.Id)
- 224 .DeleteAsync(cancellationToken);
-
-
-
-
-
- 230 if (result.InitialCompileJob !=
null)
-
- 232 logger.LogTrace(
"Loading initial compile job...");
- 233 initialDmb = await
dmbFactory.
FromCompileJob(result.InitialCompileJob,
"Session Loading Initial Deployment", cancellationToken);
-
+ 196 db.ReattachInformations.Remove(reattachInfo);
+ 197 logger.LogTrace(
"Deleting ReattachInformation {id}...", reattachInfo.Id);
+
+
+ 200 await db.Save(cancellationToken);
+
+
+ 203 if (!topicTimeout.HasValue)
+
+ 205 logger.LogDebug(
"Reattach information not found!");
+
+
+
+
+
+
+ 212 logger.LogError(
"Unable to reattach! Could not load .dmb!");
+ 213 await KillProcess(result);
+
+
+
+ 217 logger.LogTrace(
"Deleting ReattachInformation {id}...", result.Id);
+
+ 219 .ReattachInformations
+
+ 221 .Where(x => x.Id == result.Id)
+ 222 .ExecuteDeleteAsync(cancellationToken);
+
+
+
+
+
+ 228 if (result.InitialCompileJob !=
null)
+
+ 230 logger.LogTrace(
"Loading initial compile job...");
+ 231 initialDmb = await
dmbFactory.
FromCompileJob(result.InitialCompileJob,
"Session Loading Initial Deployment", cancellationToken);
+
+
+ 234 logger.LogTrace(
"Retrieved ReattachInformation");
- 236 logger.LogTrace(
"Retrieved ReattachInformation");
-
-
-
-
-
-
+
+
+
+
+
+
+ 242 logger.LogDebug(
"Reattach information loaded: {info}", info);
- 244 logger.LogDebug(
"Reattach information loaded: {info}", info);
-
-
-
-
-
-
-
-
- 254 logger.LogDebug(
"Clearing reattach information");
- 255 return ClearImpl(db,
true, cancellationToken);
-
-
-
-
- 267 var baseQuery = databaseContext
-
-
- 270 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id);
-
-
-
- 274 .DeleteAsync(cancellationToken);
-
-
- 277 var results = await baseQuery.ToListAsync(cancellationToken);
- 278 foreach (var result
in results)
-
-
-
-
-
+
+
+
+
+
+
+
+ 252 logger.LogDebug(
"Clearing reattach information");
+ 253 return ClearImpl(db,
true, cancellationToken);
+
+
+
+
+ 265 var baseQuery = databaseContext
+
+
+ 268 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id);
+
+
+
+ 272 .ExecuteDeleteAsync(cancellationToken);
+
+
+ 275 var results = await baseQuery.ToListAsync(cancellationToken);
+ 276 foreach (var result
in results)
+
+
+
+
+
Metadata about a server instance.
-
-readonly ILogger< SessionPersistor > logger
The ILogger for the SessionPersistor.
-readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionPersistor.
-readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the SessionPersistor.
-readonly Api.Models.Instance metadata
The Api.Models.Instance for the SessionPersistor.
+
+readonly ILogger< SessionPersistor > logger
The ILogger for the SessionPersistor.
+readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionPersistor.
+readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the SessionPersistor.
+readonly Api.Models.Instance metadata
The Api.Models.Instance for the SessionPersistor.
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
-readonly IDmbFactory dmbFactory
The IDmbFactory for the SessionPersistor.
-async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
-SessionPersistor(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IProcessExecutor processExecutor, ILogger< SessionPersistor > logger, Api.Models.Instance metadata)
Initializes a new instance of the SessionPersistor class.
+readonly IDmbFactory dmbFactory
The IDmbFactory for the SessionPersistor.
+async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
+SessionPersistor(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IProcessExecutor processExecutor, ILogger< SessionPersistor > logger, Api.Models.Instance metadata)
Initializes a new instance of the SessionPersistor class.
ValueTask Clear(CancellationToken cancellationToken)
Clear any stored ReattachInformation. A ValueTask representing the running operation.
ValueTask Save(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Save some reattachInformation . A ValueTask representing the running operation.
-async ValueTask ClearImpl(IDatabaseContext databaseContext, bool instant, CancellationToken cancellationToken)
Clear any stored ReattachInformation.
+async ValueTask ClearImpl(IDatabaseContext databaseContext, bool instant, CancellationToken cancellationToken)
Clear any stored ReattachInformation.
Factory for IDmbProviders.
ValueTask< IDmbProvider?> FromCompileJob(CompileJob compileJob, string reason, CancellationToken cancellationToken, [CallerFilePath] string? callerFile=null, [CallerLineNumber] int callerLine=default)
Gets a IDmbProvider for a given CompileJob.
@@ -351,7 +349,7 @@ $(function() {
ValueTask UseContextTaskReturn(Func< IDatabaseContext, Task > operation)
Run an operation in the scope of an IDatabaseContext.
ValueTask UseContext(Func< IDatabaseContext, ValueTask > operation)
Run an operation in the scope of an IDatabaseContext.
-IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
+IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
IProcess? GetProcess(int id)
Get a IProcess by id .
diff --git a/_tgstation_8_server_8_common_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_common_8_assembly_info_8cs_source.html
index b0070ba146..359d7c64cd 100644
--- a/_tgstation_8_server_8_common_8_assembly_info_8cs_source.html
+++ b/_tgstation_8_server_8_common_8_assembly_info_8cs_source.html
@@ -95,7 +95,7 @@ $(function() {
15[assembly: System.Reflection.AssemblyCopyrightAttribute(
"Copyright (c) Jordan Brown 2018")]
16[assembly: System.Reflection.AssemblyDescriptionAttribute(
"Common functions for tgstation-server.")]
17[assembly: System.Reflection.AssemblyFileVersionAttribute(
"7.0.0.0")]
- 18[assembly: System.Reflection.AssemblyInformationalVersionAttribute(
"7.0.0+e82b32582d33f917f5eb16742f1654ba165e3810")]
+ 18[assembly: System.Reflection.AssemblyInformationalVersionAttribute(
"7.0.0+89b103afbb2b6067f1b5437582ed1adfee0b8b16")]
19[assembly: System.Reflection.AssemblyProductAttribute(
"Tgstation.Server.Common")]
20[assembly: System.Reflection.AssemblyTitleAttribute(
"Tgstation.Server.Common")]
21[assembly: System.Reflection.AssemblyVersionAttribute(
"7.0.0.0")]
diff --git a/_tgstation_8_server_8_shared_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_shared_8_assembly_info_8cs_source.html
index 4d3032d95c..5aed2d0e17 100644
--- a/_tgstation_8_server_8_shared_8_assembly_info_8cs_source.html
+++ b/_tgstation_8_server_8_shared_8_assembly_info_8cs_source.html
@@ -93,7 +93,7 @@ $(function() {
13[assembly: System.Reflection.AssemblyCompanyAttribute(
"Tgstation.Server.Shared")]
14[assembly: System.Reflection.AssemblyConfigurationAttribute(
"Release")]
15[assembly: System.Reflection.AssemblyFileVersionAttribute(
"6.8.0.0")]
- 16[assembly: System.Reflection.AssemblyInformationalVersionAttribute(
"6.8.0+e82b32582d33f917f5eb16742f1654ba165e3810")]
+ 16[assembly: System.Reflection.AssemblyInformationalVersionAttribute(
"6.8.0+89b103afbb2b6067f1b5437582ed1adfee0b8b16")]
17[assembly: System.Reflection.AssemblyProductAttribute(
"Tgstation.Server.Shared")]
18[assembly: System.Reflection.AssemblyTitleAttribute(
"Tgstation.Server.Shared")]
19[assembly: System.Reflection.AssemblyVersionAttribute(
"6.8.0.0")]
diff --git a/_user_group_controller_8cs_source.html b/_user_group_controller_8cs_source.html
index 49e487e1b4..53fd02c3ce 100644
--- a/_user_group_controller_8cs_source.html
+++ b/_user_group_controller_8cs_source.html
@@ -101,170 +101,168 @@ $(function() {
- 24using Z.EntityFramework.Plus;
-
-
-
-
-
-
-
-
-
-
-
- 50 IOptions<GeneralConfiguration> generalConfigurationOptions,
- 51 ILogger<UserGroupController> logger,
-
-
-
- 55 authenticationContext,
-
-
-
-
- 60 generalConfiguration = generalConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(generalConfigurationOptions));
-
-
-
-
-
-
-
- 75 ArgumentNullException.ThrowIfNull(model);
-
- 77 if (model.Name ==
null)
-
-
-
-
-
- 83 .CountAsync(cancellationToken);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 101 Logger.LogInformation(
"Created new user group {groupName} ({groupId})", dbGroup.Name, dbGroup.Id);
-
- 103 return Created(dbGroup.ToApi(
true));
-
-
-
-
-
-
-
- 119 ArgumentNullException.ThrowIfNull(model);
-
-
-
-
- 124 .Where(x => x.Id == model.Id)
- 125 .Include(x => x.PermissionSet)
- 126 .Include(x => x.Users)
- 127 .FirstOrDefaultAsync(cancellationToken);
-
- 129 if (currentGroup ==
default)
-
-
- 132 if (model.PermissionSet !=
null)
-
- 134 currentGroup.PermissionSet!.AdministrationRights = model.PermissionSet.AdministrationRights ?? currentGroup.PermissionSet.AdministrationRights;
- 135 currentGroup.PermissionSet.InstanceManagerRights = model.PermissionSet.InstanceManagerRights ?? currentGroup.PermissionSet.InstanceManagerRights;
-
+
+
+
+
+
+
+
+
+
+
+ 48 IOptions<GeneralConfiguration> generalConfigurationOptions,
+ 49 ILogger<UserGroupController> logger,
+
+
+
+ 53 authenticationContext,
+
+
+
+
+ 58 generalConfiguration = generalConfigurationOptions?.Value ??
throw new ArgumentNullException(nameof(generalConfigurationOptions));
+
+
+
+
+
+
+
+ 73 ArgumentNullException.ThrowIfNull(model);
+
+ 75 if (model.Name ==
null)
+
+
+
+
+
+ 81 .CountAsync(cancellationToken);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 99 Logger.LogInformation(
"Created new user group {groupName} ({groupId})", dbGroup.Name, dbGroup.Id);
+
+ 101 return Created(dbGroup.ToApi(
true));
+
+
+
+
+
+
+
+ 117 ArgumentNullException.ThrowIfNull(model);
+
+
+
+
+ 122 .Where(x => x.Id == model.Id)
+ 123 .Include(x => x.PermissionSet)
+ 124 .Include(x => x.Users)
+ 125 .FirstOrDefaultAsync(cancellationToken);
+
+ 127 if (currentGroup ==
default)
+
+
+ 130 if (model.PermissionSet !=
null)
+
+ 132 currentGroup.PermissionSet!.AdministrationRights = model.PermissionSet.AdministrationRights ?? currentGroup.PermissionSet.AdministrationRights;
+ 133 currentGroup.PermissionSet.InstanceManagerRights = model.PermissionSet.InstanceManagerRights ?? currentGroup.PermissionSet.InstanceManagerRights;
+
+
+ 136 currentGroup.Name = model.Name ?? currentGroup.Name;
- 138 currentGroup.Name = model.Name ?? currentGroup.Name;
+
-
-
-
-
-
- 145 Id = currentGroup.
Id,
-
-
- 148 return Json(currentGroup.ToApi(
true));
-
-
-
-
-
-
- 163 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
-
-
-
-
-
- 169 .Where(x => x.Id ==
id)
- 170 .Include(x => x.Users)
- 171 .Include(x => x.PermissionSet)
- 172 .FirstOrDefaultAsync(cancellationToken);
- 173 if (group ==
default)
-
- 175 return Json(group.ToApi(
true));
-
-
-
-
-
- 189 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
- 190 => Paginated<UserGroup, UserGroupResponse>(
- 191 () => ValueTask.FromResult(
-
-
-
-
- 196 .Include(x => x.Users)
- 197 .Include(x => x.PermissionSet)
- 198 .OrderBy(x => x.Id))),
-
-
-
-
-
-
-
- 215 [ProducesResponseType(204)]
-
-
- 218 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
-
-
-
-
- 223 .Where(x => x.Id ==
id && x.Users!.Count == 0)
- 224 .DeleteAsync(cancellationToken);
-
-
-
-
-
-
-
-
- 233 .Where(x => x.Id ==
id)
- 234 .AnyAsync(cancellationToken);
-
-
-
-
-
-
-
+
+
+
+ 143 Id = currentGroup.
Id,
+
+
+ 146 return Json(currentGroup.ToApi(
true));
+
+
+
+
+
+
+ 161 public async ValueTask<IActionResult>
GetId(
long id, CancellationToken cancellationToken)
+
+
+
+
+
+ 167 .Where(x => x.Id ==
id)
+ 168 .Include(x => x.Users)
+ 169 .Include(x => x.PermissionSet)
+ 170 .FirstOrDefaultAsync(cancellationToken);
+ 171 if (group ==
default)
+
+ 173 return Json(group.ToApi(
true));
+
+
+
+
+
+ 187 public ValueTask<IActionResult>
List([FromQuery]
int? page, [FromQuery]
int? pageSize, CancellationToken cancellationToken)
+ 188 => Paginated<UserGroup, UserGroupResponse>(
+ 189 () => ValueTask.FromResult(
+
+
+
+
+ 194 .Include(x => x.Users)
+ 195 .Include(x => x.PermissionSet)
+ 196 .OrderBy(x => x.Id))),
+
+
+
+
+
+
+
+ 213 [ProducesResponseType(204)]
+
+
+ 216 public async ValueTask<IActionResult>
Delete(
long id, CancellationToken cancellationToken)
+
+
+
+
+ 221 .Where(x => x.Id ==
id && x.Users!.Count == 0)
+ 222 .ExecuteDeleteAsync(cancellationToken);
+
+
+
+
+
+
+
+
+ 231 .Where(x => x.Id ==
id)
+ 232 .AnyAsync(cancellationToken);
+
+
+
+
+
+
+
virtual ? string Name
The name of the entity represented by the NamedEntity.
@@ -283,14 +281,14 @@ $(function() {
ObjectResult Created(object payload)
Generic 201 response with a given payload .
ILogger< ApiController > Logger
The ILogger for the ApiController.
Helper for returning paginated models.
-ApiController for managing UserGroupResponses.
-async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Gets a specific UserGroup.
-UserGroupController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< UserGroupController > logger, IApiHeadersProvider apiHeaders)
Initializes a new instance of the UserGroupController class.
-async ValueTask< IActionResult > Create([FromBody] UserGroupCreateRequest model, CancellationToken cancellationToken)
Create a new UserGroup.
-readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserGroupController.
-async ValueTask< IActionResult > Update([FromBody] UserGroupUpdateRequest model, CancellationToken cancellationToken)
Update a UserGroup.
+ApiController for managing UserGroupResponses.
+async ValueTask< IActionResult > GetId(long id, CancellationToken cancellationToken)
Gets a specific UserGroup.
+UserGroupController(IDatabaseContext databaseContext, IAuthenticationContext authenticationContext, IOptions< GeneralConfiguration > generalConfigurationOptions, ILogger< UserGroupController > logger, IApiHeadersProvider apiHeaders)
Initializes a new instance of the UserGroupController class.
+async ValueTask< IActionResult > Create([FromBody] UserGroupCreateRequest model, CancellationToken cancellationToken)
Create a new UserGroup.
+readonly GeneralConfiguration generalConfiguration
The GeneralConfiguration for the UserGroupController.
+async ValueTask< IActionResult > Update([FromBody] UserGroupUpdateRequest model, CancellationToken cancellationToken)
Update a UserGroup.
ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
Lists all UserGroups.
-async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete a UserGroup.
+async ValueTask< IActionResult > Delete(long id, CancellationToken cancellationToken)
Delete a UserGroup.
Backend abstract implementation of IDatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
DbSet< UserGroup > Groups
The UserGroups in the DatabaseContext.
diff --git a/_watchdog_base_8cs_source.html b/_watchdog_base_8cs_source.html
index 9675b9d182..f0acac4a8e 100644
--- a/_watchdog_base_8cs_source.html
+++ b/_watchdog_base_8cs_source.html
@@ -1155,8 +1155,8 @@ $(function() {
ICollection< ChatMessage >? ChatResponses
The ChatMessages to send as the result of a TopicCommandType.EventNotification request,...
-
-async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
+
+async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
ValueTask Clear(CancellationToken cancellationToken)
Clear any stored ReattachInformation. A ValueTask representing the running operation.
Base class for IWatchdogs.
async ValueTask HandleRestart(Version? updateVersion, bool handlerMayDelayShutdownWithExtremelyLongRunningTasks, CancellationToken cancellationToken)
Handle a restart of the server. A ValueTask representing the running operation.
diff --git a/changelog.yml b/changelog.yml
index 1f73d43fb0..f922ce490b 100644
--- a/changelog.yml
+++ b/changelog.yml
@@ -163,7 +163,6 @@ Components:
Unreleased: true
- Version: 6.8.1
ComponentVersions:
- Core: 6.8.0
HttpApi: 10.6.0
DreamMakerApi: 7.1.3
Configuration: 5.1.0
@@ -173,7 +172,11 @@ Components:
NugetApi: 13.6.0
NugetClient: 15.6.0
WebControlPanel: 5.9.0
- Changes: []
+ Changes:
+ - Descriptions:
+ - Fixed an issue where instances would fail to detach due to database conflicts.
+ Author: Cyberboss
+ PullRequest: 1845
Unreleased: true
- Version: 6.8.0
ComponentVersions:
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_default_credentials.html b/class_tgstation_1_1_server_1_1_api_1_1_default_credentials.html
index b70a27b095..fe82da791b 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_default_credentials.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_default_credentials.html
@@ -132,7 +132,7 @@ Static Public Attributes
Definition at line 11 of file DefaultCredentials.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.GetAdminUser(), Tgstation.Server.Host.Database.DatabaseSeeder.SeedAdminUser(), and Tgstation.Server.Host.Controllers.UserController.Update().
+Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.GetAdminUser(), Tgstation.Server.Host.Database.DatabaseSeeder.SeedAdminUser(), and Tgstation.Server.Host.Controllers.UserController.Update().
@@ -160,7 +160,7 @@ Static Public Attributes
Definition at line 16 of file DefaultCredentials.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.ResetAdminPassword(), and Tgstation.Server.Host.Database.DatabaseSeeder.SeedAdminUser().
+Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.ResetAdminPassword(), and Tgstation.Server.Host.Database.DatabaseSeeder.SeedAdminUser().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_entity_id.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_entity_id.html
index 668c9fbeef..f3ae62ef2f 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_entity_id.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_entity_id.html
@@ -161,7 +161,7 @@ Properties
Definition at line 13 of file EntityId.cs.
-Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.BeforeApplyDmb(), Tgstation.Server.Host.Jobs.JobService.CancelJob(), Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Client.InstanceManagerClient.CreateClient(), Tgstation.Server.Host.Components.Deployment.DeploymentLockManager.CreateLock(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Api.Models.UserName.CreateUserName< TResultType >(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Delete(), Tgstation.Server.Host.Controllers.JobController.Delete(), Tgstation.Server.Host.Components.Deployment.DeploymentLockManager.DeploymentLockManager(), Tgstation.Server.Host.Components.Deployment.DmbFactory.FromCompileJobInternal(), Tgstation.Server.Host.Controllers.ChatController.GetId(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.GetId(), Tgstation.Server.Host.Controllers.JobController.GetId(), Tgstation.Server.Host.Controllers.UserController.GetId(), Tgstation.Server.Host.Components.Watchdog.AdvancedWatchdog.HandleNewDmbAvailable(), Tgstation.Server.Host.Controllers.ApiController.HookExecuteAction(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitController(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitialCheckDmbUpdated(), Tgstation.Server.Client.Components.InstanceClient.InstanceClient(), Tgstation.Server.Host.Models.Job.Job(), Tgstation.Server.Host.Components.Session.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Components.InstanceManager.MoveInstance(), Tgstation.Server.Host.Components.Watchdog.AdvancedWatchdog.PerformDmbSwap(), Tgstation.Server.Host.Controllers.DreamMakerController.Read(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Client.Components.ConfigurationClient.Read(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Components.Session.SessionControllerFactory.Reattach(), Tgstation.Server.Host.Jobs.JobService.RegisterOperation(), Tgstation.Server.Host.Components.Repository.RepositoryUpdateService.RepositoryUpdateJob(), Tgstation.Server.Host.Jobs.JobService.RunJob(), Tgstation.Server.Client.Components.EngineClient.SetActiveVersion(), Tgstation.Server.Host.Models.ChatBot.ToApi(), Tgstation.Server.Host.Models.CompileJob.ToApi(), Tgstation.Server.Host.Models.Instance.ToApi(), Tgstation.Server.Host.Models.Job.ToApi(), Tgstation.Server.Host.Models.UserGroup.ToApi(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.EngineController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.RepositoryController.Update(), Tgstation.Server.Host.Jobs.JobsHubGroupMapper.UserDisabled(), and Tgstation.Server.Client.Components.ConfigurationClient.Write().
+Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.BeforeApplyDmb(), Tgstation.Server.Host.Jobs.JobService.CancelJob(), Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Client.InstanceManagerClient.CreateClient(), Tgstation.Server.Host.Components.Deployment.DeploymentLockManager.CreateLock(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Api.Models.UserName.CreateUserName< TResultType >(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Delete(), Tgstation.Server.Host.Controllers.JobController.Delete(), Tgstation.Server.Host.Components.Deployment.DeploymentLockManager.DeploymentLockManager(), Tgstation.Server.Host.Components.Deployment.DmbFactory.FromCompileJobInternal(), Tgstation.Server.Host.Controllers.ChatController.GetId(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.GetId(), Tgstation.Server.Host.Controllers.JobController.GetId(), Tgstation.Server.Host.Controllers.UserController.GetId(), Tgstation.Server.Host.Components.Watchdog.AdvancedWatchdog.HandleNewDmbAvailable(), Tgstation.Server.Host.Controllers.ApiController.HookExecuteAction(), Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitController(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.InitialCheckDmbUpdated(), Tgstation.Server.Client.Components.InstanceClient.InstanceClient(), Tgstation.Server.Host.Models.Job.Job(), Tgstation.Server.Host.Components.Session.SessionControllerFactory.LaunchNew(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Components.InstanceManager.MoveInstance(), Tgstation.Server.Host.Components.Watchdog.AdvancedWatchdog.PerformDmbSwap(), Tgstation.Server.Host.Controllers.DreamMakerController.Read(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Client.Components.ConfigurationClient.Read(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Components.Session.SessionControllerFactory.Reattach(), Tgstation.Server.Host.Jobs.JobService.RegisterOperation(), Tgstation.Server.Host.Components.Repository.RepositoryUpdateService.RepositoryUpdateJob(), Tgstation.Server.Host.Jobs.JobService.RunJob(), Tgstation.Server.Client.Components.EngineClient.SetActiveVersion(), Tgstation.Server.Host.Models.ChatBot.ToApi(), Tgstation.Server.Host.Models.CompileJob.ToApi(), Tgstation.Server.Host.Models.Instance.ToApi(), Tgstation.Server.Host.Models.Job.ToApi(), Tgstation.Server.Host.Models.UserGroup.ToApi(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.EngineController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.RepositoryController.Update(), Tgstation.Server.Host.Jobs.JobsHubGroupMapper.UserDisabled(), and Tgstation.Server.Client.Components.ConfigurationClient.Write().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html
index f6ded0892b..8d6cb6df0e 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html
@@ -228,7 +228,7 @@ Properties
Definition at line 50 of file Instance.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Models.Instance.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Models.Instance.ToApi().
@@ -315,7 +315,7 @@ Properties
Definition at line 15 of file Instance.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Models.Instance.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Models.Instance.ToApi().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_api_base.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_api_base.html
index c5250870ac..7fbe3f0004 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_api_base.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_api_base.html
@@ -192,7 +192,7 @@ Properties
References Tgstation.Server.Api.Models.Internal.ChatBotApiBase.Channels, and Tgstation.Server.Api.Models.Internal.ChatBotSettings.Provider.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks().
@@ -233,7 +233,7 @@ Here is the caller graph for this function:
Definition at line 13 of file ChatBotApiBase.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Api.Models.Internal.ChatBotApiBase.ValidateProviderChannelTypes().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Api.Models.Internal.ChatBotApiBase.ValidateProviderChannelTypes().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_settings.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_settings.html
index dcfadf0c7e..f55014d24d 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_settings.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_bot_settings.html
@@ -284,7 +284,7 @@ Here is the call graph for this function:
Definition at line 44 of file ChatBotSettings.cs.
-Referenced by Tgstation.Server.Api.Models.Internal.ChatBotSettings.CreateConnectionStringBuilder(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DiscordProvider(), Tgstation.Server.Host.Database.MySqlDatabaseContext.OnModelCreating(), Tgstation.Server.Api.Models.Internal.ChatBotSettings.SetConnectionStringBuilder(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Models.ChatBot.ToApi().
+Referenced by Tgstation.Server.Api.Models.Internal.ChatBotSettings.CreateConnectionStringBuilder(), Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.DiscordProvider(), Tgstation.Server.Host.Database.MySqlDatabaseContext.OnModelCreating(), Tgstation.Server.Api.Models.Internal.ChatBotSettings.SetConnectionStringBuilder(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Models.ChatBot.ToApi().
@@ -342,7 +342,7 @@ Here is the call graph for this function:
Definition at line 35 of file ChatBotSettings.cs.
-Referenced by Tgstation.Server.Api.Models.Internal.ChatBotSettings.CreateConnectionStringBuilder(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Models.ChatBot.ToApi(), and Tgstation.Server.Api.Models.Internal.ChatBotApiBase.ValidateProviderChannelTypes().
+Referenced by Tgstation.Server.Api.Models.Internal.ChatBotSettings.CreateConnectionStringBuilder(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Models.ChatBot.ToApi(), and Tgstation.Server.Api.Models.Internal.ChatBotApiBase.ValidateProviderChannelTypes().
@@ -371,7 +371,7 @@ Here is the call graph for this function:
Definition at line 21 of file ChatBotSettings.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Models.ChatBot.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Models.ChatBot.ToApi().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_channel_base.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_channel_base.html
index ff4b5beeca..2dba761ef5 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_channel_base.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_chat_channel_base.html
@@ -259,7 +259,7 @@ Properties
Definition at line 39 of file ChatChannelBase.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), and Tgstation.Server.Host.Models.ChatChannel.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), and Tgstation.Server.Host.Models.ChatChannel.ToApi().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_server_information_base.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_server_information_base.html
index cba412c3da..fbfe8d3402 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_server_information_base.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_server_information_base.html
@@ -201,7 +201,7 @@ Properties
Definition at line 28 of file ServerInformationBase.cs.
-Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Configuration.GeneralConfiguration.GeneralConfiguration(), and Tgstation.Server.Host.Controllers.ApiRootController.ServerInfo().
+Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Configuration.GeneralConfiguration.GeneralConfiguration(), and Tgstation.Server.Host.Controllers.ApiRootController.ServerInfo().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_swarm_server.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_swarm_server.html
index 7c16870efd..4a7b221392 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_swarm_server.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_swarm_server.html
@@ -167,7 +167,7 @@ Properties
Definition at line 26 of file SwarmServer.cs.
-Referenced by Tgstation.Server.Host.Swarm.SwarmService.CommitUpdate(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Utils.PortAllocator.GetAvailablePort(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Swarm.SwarmService.HealthCheckNodes(), Tgstation.Server.Host.Components.InstanceManager.Initialize(), Tgstation.Server.Host.Swarm.SwarmService.Initialize(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Swarm.SwarmService.PrepareSwarmRequest(), Tgstation.Server.Host.Swarm.SwarmService.PrepareUpdateImpl(), Tgstation.Server.Host.Database.DatabaseSeeder.SanitizeDatabase(), Tgstation.Server.Host.Swarm.SwarmService.SendUpdatedServerListToNodes(), Tgstation.Server.Host.Swarm.SwarmService.SwarmService(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Extensions.ApplicationBuilderExtensions.UseAdditionalRequestLoggingContext().
+Referenced by Tgstation.Server.Host.Swarm.SwarmService.CommitUpdate(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Security.AuthenticationContextFactory.CreateAuthenticationContext(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Utils.PortAllocator.GetAvailablePort(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Swarm.SwarmService.HealthCheckNodes(), Tgstation.Server.Host.Components.InstanceManager.Initialize(), Tgstation.Server.Host.Swarm.SwarmService.Initialize(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Swarm.SwarmService.PrepareSwarmRequest(), Tgstation.Server.Host.Swarm.SwarmService.PrepareUpdateImpl(), Tgstation.Server.Host.Database.DatabaseSeeder.SanitizeDatabase(), Tgstation.Server.Host.Swarm.SwarmService.SendUpdatedServerListToNodes(), Tgstation.Server.Host.Swarm.SwarmService.SwarmService(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Extensions.ApplicationBuilderExtensions.UseAdditionalRequestLoggingContext().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_group.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_group.html
index 927e9a31fb..a6b6873a2d 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_group.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user_group.html
@@ -157,7 +157,7 @@ Properties
13 set => base.Id = value;
14 }
-Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Update().
+Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Update().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_named_entity.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_named_entity.html
index 17ff01d61d..3d7976542c 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_named_entity.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_named_entity.html
@@ -166,7 +166,7 @@ Properties
Definition at line 16 of file NamedEntity.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Database.MySqlDatabaseContext.OnModelCreating(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Models.ChatBot.ToApi(), Tgstation.Server.Host.Models.Instance.ToApi(), and Tgstation.Server.Host.Models.UserGroup.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Database.MySqlDatabaseContext.OnModelCreating(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Models.ChatBot.ToApi(), Tgstation.Server.Host.Models.Instance.ToApi(), and Tgstation.Server.Host.Models.UserGroup.ToApi().
diff --git a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_permission_set.html b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_permission_set.html
index 6a0cc1e5a8..609616128e 100644
--- a/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_permission_set.html
+++ b/class_tgstation_1_1_server_1_1_api_1_1_models_1_1_permission_set.html
@@ -149,7 +149,7 @@ Properties
Definition at line 24 of file PermissionSet.cs.
-Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Models.PermissionSet.ToApi(), Tgstation.Server.Host.Controllers.AdministrationController.Update(), and Tgstation.Server.Host.Controllers.UserGroupController.Update().
+Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Models.PermissionSet.ToApi(), Tgstation.Server.Host.Controllers.AdministrationController.Update(), and Tgstation.Server.Host.Controllers.UserGroupController.Update().
@@ -181,7 +181,7 @@ Properties
17 set => base.Id = value;
18 }
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Jobs.JobsHubGroupMapper.InstancePermissionSetDeleted(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Models.PermissionSet.ToApi().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Jobs.JobsHubGroupMapper.InstancePermissionSetDeleted(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Models.PermissionSet.ToApi().
@@ -210,7 +210,7 @@ Properties
Definition at line 30 of file PermissionSet.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Models.PermissionSet.ToApi(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Models.PermissionSet.ToApi(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html
index c904006a3a..566496e661 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html
@@ -809,7 +809,7 @@ Here is the call graph for this function:
-
+
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
IChatManager CreateChatManager(ICommandFactory commandFactory, IEnumerable< Models.ChatBot > initialChatBots)
Create a IChatManager.
IRepositoryManager CreateRepositoryManager(IIOManager ioManager, IEventConsumer eventConsumer)
Create a IRepositoryManager.
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_persistor.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_persistor.html
index 57aa90b5b0..fe26b6ef8b 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_persistor.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_session_1_1_session_persistor.html
@@ -200,7 +200,7 @@ Private Attributes
-
Definition at line 19 of file SessionPersistor.cs.
+
Definition at line 17 of file SessionPersistor.cs.
◆ SessionPersistor()
@@ -258,21 +258,21 @@ Private Attributes
-Definition at line 54 of file SessionPersistor.cs.
-
@@ -304,7 +304,7 @@ Private Attributes
Implements Tgstation.Server.Host.Components.Session.ISessionPersistor.
-References Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), and Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
+References Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), and Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.DisposeAndNullControllers().
- Returns
- A ValueTask representing the running operation.
-Definition at line 265 of file SessionPersistor.cs.
- 266 {
-
267 var baseQuery = databaseContext
-
-
269 .AsQueryable()
-
270 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id);
-
271
-
272 if (instant)
-
273 await baseQuery
-
274 .DeleteAsync(cancellationToken);
-
275 else
-
276 {
-
277 var results = await baseQuery.ToListAsync(cancellationToken);
-
278 foreach (var result in results)
-
-
280 }
-
281 }
+
Definition at line 263 of file SessionPersistor.cs.
+
264 {
+
265 var baseQuery = databaseContext
+
+
267 .AsQueryable()
+
268 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id);
+
269
+
270 if (instant)
+
271 await baseQuery
+
272 .ExecuteDeleteAsync(cancellationToken);
+
273 else
+
274 {
+
275 var results = await baseQuery.ToListAsync(cancellationToken);
+
276 foreach (var result in results)
+
+
278 }
+
279 }
void Remove(TModel model)
Remove a given model from the the working set.
-
IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
+
IDatabaseCollection< ReattachInformation > ReattachInformations
The DbSet<TEntity> for ReattachInformations.
-
References Tgstation.Server.Host.Components.Session.SessionPersistor.metadata, Tgstation.Server.Host.Database.IDatabaseContext.ReattachInformations, and Tgstation.Server.Host.Database.IDatabaseCollection< TModel >.Remove().
+
References Tgstation.Server.Host.Components.Session.SessionPersistor.metadata, Tgstation.Server.Host.Database.IDatabaseContext.ReattachInformations, and Tgstation.Server.Host.Database.IDatabaseCollection< TModel >.Remove().
Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Clear(), and Tgstation.Server.Host.Components.Session.SessionPersistor.Save().
Implements Tgstation.Server.Host.Components.Session.ISessionPersistor.
-
Definition at line 128 of file SessionPersistor.cs.
-
129 {
-
130 Models.ReattachInformation? result = null;
-
131 TimeSpan? topicTimeout = null;
-
132
-
133 async ValueTask KillProcess(Models.ReattachInformation reattachInfo)
-
134 {
-
135 try
-
136 {
-
-
138 if (process != null)
-
139 {
-
140 if (reattachInfo == result)
-
141 {
-
142 logger.LogWarning(
"Killing PID {pid} associated with CompileJob-less reattach information...", reattachInfo.ProcessId);
-
143 }
-
144 else
-
145 {
-
146 logger.LogWarning(
"Killing PID {pid} associated with extra reattach information...", reattachInfo.ProcessId);
-
147 }
-
148
-
149 process.Terminate();
-
150 await process.Lifetime;
-
151 }
-
152 }
-
-
154 {
-
155 logger.LogWarning(ex,
"Failed to kill process!");
-
156 }
-
157 }
-
158
-
-
160 {
-
161 var dbReattachInfos = await db
-
162 .ReattachInformations
-
163 .AsQueryable()
-
164 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id)
-
165 .Include(x => x.CompileJob)
-
166 .Include(x => x.InitialCompileJob)
-
167 .ToListAsync(cancellationToken);
-
168 result = dbReattachInfos.FirstOrDefault();
-
169 if (result == null)
-
170 return;
-
171
-
172 var timeoutMilliseconds = await db
-
173 .Instances
-
174 .AsQueryable()
-
-
176 .Select(x => x.DreamDaemonSettings!.TopicRequestTimeout)
-
177 .FirstOrDefaultAsync(cancellationToken);
-
178
-
179 if (timeoutMilliseconds == default)
-
180 {
-
181 logger.LogCritical(
"Missing TopicRequestTimeout!");
-
182 return;
-
183 }
+
Definition at line 126 of file SessionPersistor.cs.
+
127 {
+
128 Models.ReattachInformation? result = null;
+
129 TimeSpan? topicTimeout = null;
+
130
+
131 async ValueTask KillProcess(Models.ReattachInformation reattachInfo)
+
132 {
+
133 try
+
134 {
+
+
136 if (process != null)
+
137 {
+
138 if (reattachInfo == result)
+
139 {
+
140 logger.LogWarning(
"Killing PID {pid} associated with CompileJob-less reattach information...", reattachInfo.ProcessId);
+
141 }
+
142 else
+
143 {
+
144 logger.LogWarning(
"Killing PID {pid} associated with extra reattach information...", reattachInfo.ProcessId);
+
145 }
+
146
+
147 process.Terminate();
+
148 await process.Lifetime;
+
149 }
+
150 }
+
+
152 {
+
153 logger.LogWarning(ex,
"Failed to kill process!");
+
154 }
+
155 }
+
156
+
+
158 {
+
159 var dbReattachInfos = await db
+
160 .ReattachInformations
+
161 .AsQueryable()
+
162 .Where(x => x.CompileJob!.Job.Instance!.Id ==
metadata.Id)
+
163 .Include(x => x.CompileJob)
+
164 .Include(x => x.InitialCompileJob)
+
165 .ToListAsync(cancellationToken);
+
166 result = dbReattachInfos.FirstOrDefault();
+
167 if (result == null)
+
168 return;
+
169
+
170 var timeoutMilliseconds = await db
+
171 .Instances
+
172 .AsQueryable()
+
+
174 .Select(x => x.DreamDaemonSettings!.TopicRequestTimeout)
+
175 .FirstOrDefaultAsync(cancellationToken);
+
176
+
177 if (timeoutMilliseconds == default)
+
178 {
+
179 logger.LogCritical(
"Missing TopicRequestTimeout!");
+
180 return;
+
181 }
+
182
+
183 topicTimeout = TimeSpan.FromMilliseconds(timeoutMilliseconds.Value);
184
-
185 topicTimeout = TimeSpan.FromMilliseconds(timeoutMilliseconds.Value);
-
186
-
187 bool first = true;
-
188 foreach (var reattachInfo in dbReattachInfos)
-
189 {
-
190 if (first)
-
191 {
-
192 first = false;
-
193 continue;
-
194 }
+
185 bool first = true;
+
186 foreach (var reattachInfo in dbReattachInfos)
+
187 {
+
188 if (first)
+
189 {
+
190 first = false;
+
191 continue;
+
192 }
+
193
+
194 await KillProcess(reattachInfo);
195
-
196 await KillProcess(reattachInfo);
-
197
-
198 db.ReattachInformations.Remove(reattachInfo);
-
199 logger.LogTrace(
"Deleting ReattachInformation {id}...", reattachInfo.Id);
-
200 }
-
201
-
202 await db.Save(cancellationToken);
-
203 });
-
204
-
205 if (!topicTimeout.HasValue)
-
206 {
-
207 logger.LogDebug(
"Reattach information not found!");
-
208 return null;
-
209 }
-
210
-
-
212 if (dmb == null)
-
213 {
-
214 logger.LogError(
"Unable to reattach! Could not load .dmb!");
-
215 await KillProcess(result);
-
216
-
-
218 {
-
219 logger.LogTrace(
"Deleting ReattachInformation {id}...", result.Id);
-
220 await db
-
221 .ReattachInformations
-
222 .AsQueryable()
-
223 .Where(x => x.Id == result.Id)
-
224 .DeleteAsync(cancellationToken);
-
225 });
-
226 return null;
-
227 }
-
228
-
-
230 if (result.InitialCompileJob != null)
-
231 {
-
232 logger.LogTrace(
"Loading initial compile job...");
-
233 initialDmb = await
dmbFactory.
FromCompileJob(result.InitialCompileJob,
"Session Loading Initial Deployment", cancellationToken);
-
234 }
+
196 db.ReattachInformations.Remove(reattachInfo);
+
197 logger.LogTrace(
"Deleting ReattachInformation {id}...", reattachInfo.Id);
+
198 }
+
199
+
200 await db.Save(cancellationToken);
+
201 });
+
202
+
203 if (!topicTimeout.HasValue)
+
204 {
+
205 logger.LogDebug(
"Reattach information not found!");
+
206 return null;
+
207 }
+
208
+
+
210 if (dmb == null)
+
211 {
+
212 logger.LogError(
"Unable to reattach! Could not load .dmb!");
+
213 await KillProcess(result);
+
214
+
+
216 {
+
217 logger.LogTrace(
"Deleting ReattachInformation {id}...", result.Id);
+
218 await db
+
219 .ReattachInformations
+
220 .AsQueryable()
+
221 .Where(x => x.Id == result.Id)
+
222 .ExecuteDeleteAsync(cancellationToken);
+
223 });
+
224 return null;
+
225 }
+
226
+
+
228 if (result.InitialCompileJob != null)
+
229 {
+
230 logger.LogTrace(
"Loading initial compile job...");
+
231 initialDmb = await
dmbFactory.
FromCompileJob(result.InitialCompileJob,
"Session Loading Initial Deployment", cancellationToken);
+
232 }
+
233
+
234 logger.LogTrace(
"Retrieved ReattachInformation");
235
-
236 logger.LogTrace(
"Retrieved ReattachInformation");
-
237
-
-
239 result,
-
240 dmb,
-
241 initialDmb,
-
242 topicTimeout.Value);
+
+
237 result,
+
238 dmb,
+
239 initialDmb,
+
240 topicTimeout.Value);
+
241
+
242 logger.LogDebug(
"Reattach information loaded: {info}", info);
243
-
244 logger.LogDebug(
"Reattach information loaded: {info}", info);
-
245
-
246 return info;
-
247 }
+
244 return info;
+
245 }
@@ -601,7 +601,7 @@ Here is the caller graph for this function:
ValueTask UseContext(Func< IDatabaseContext, ValueTask > operation)
Run an operation in the scope of an IDatabaseContext.
IProcess? GetProcess(int id)
Get a IProcess by id .
-
References Tgstation.Server.Host.Components.Session.SessionPersistor.databaseContextFactory, Tgstation.Server.Host.Components.Session.SessionPersistor.dmbFactory, Tgstation.Server.Host.Components.Deployment.IDmbFactory.FromCompileJob(), Tgstation.Server.Host.System.IProcessExecutor.GetProcess(), Tgstation.Server.Host.Components.Session.SessionPersistor.logger, Tgstation.Server.Host.Components.Session.SessionPersistor.metadata, Tgstation.Server.Host.Components.Session.SessionPersistor.processExecutor, and Tgstation.Server.Host.Database.IDatabaseContextFactory.UseContext().
+
References Tgstation.Server.Host.Components.Session.SessionPersistor.databaseContextFactory, Tgstation.Server.Host.Components.Session.SessionPersistor.dmbFactory, Tgstation.Server.Host.Components.Deployment.IDmbFactory.FromCompileJob(), Tgstation.Server.Host.System.IProcessExecutor.GetProcess(), Tgstation.Server.Host.Components.Session.SessionPersistor.logger, Tgstation.Server.Host.Components.Session.SessionPersistor.metadata, Tgstation.Server.Host.Components.Session.SessionPersistor.processExecutor, and Tgstation.Server.Host.Database.IDatabaseContextFactory.UseContext().
Referenced by Tgstation.Server.Host.Components.Watchdog.WatchdogBase.StartAsync().
Implements Tgstation.Server.Host.Components.Session.ISessionPersistor.
-
References Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), and Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
+
References Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), and Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
@@ -717,7 +717,7 @@ Here is the call graph for this function:
Implements Tgstation.Server.Host.Components.Session.ISessionPersistor.
-
References Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
+
References Tgstation.Server.Host.Components.Session.SessionPersistor.logger.
Referenced by Tgstation.Server.Host.Components.Watchdog.AdvancedWatchdog.HandleNormalReboot(), and Tgstation.Server.Host.Components.Watchdog.BasicWatchdog.InitController().
The IDatabaseContextFactory for the SessionPersistor.
-
Definition at line 24 of file SessionPersistor.cs.
+
Definition at line 22 of file SessionPersistor.cs.
-
Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
+
Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
@@ -784,9 +784,9 @@ Here is the caller graph for this function:
The IDmbFactory for the SessionPersistor.
-Definition at line 29 of file SessionPersistor.cs.
+Definition at line 27 of file SessionPersistor.cs.
-Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
+Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
@@ -812,9 +812,9 @@ Here is the caller graph for this function:
The ILogger for the SessionPersistor.
-Definition at line 39 of file SessionPersistor.cs.
+Definition at line 37 of file SessionPersistor.cs.
-Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Clear(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), Tgstation.Server.Host.Components.Session.SessionPersistor.Save(), Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor(), and Tgstation.Server.Host.Components.Session.SessionPersistor.Update().
+Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Clear(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), Tgstation.Server.Host.Components.Session.SessionPersistor.Save(), Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor(), and Tgstation.Server.Host.Components.Session.SessionPersistor.Update().
@@ -840,9 +840,9 @@ Here is the caller graph for this function:
The Api.Models.Instance for the SessionPersistor.
-Definition at line 44 of file SessionPersistor.cs.
+Definition at line 42 of file SessionPersistor.cs.
-Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
+Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.ClearImpl(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
@@ -868,9 +868,9 @@ Here is the caller graph for this function:
The IProcessExecutor for the SessionPersistor.
-Definition at line 34 of file SessionPersistor.cs.
+Definition at line 32 of file SessionPersistor.cs.
-Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
+Referenced by Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), and Tgstation.Server.Host.Components.Session.SessionPersistor.SessionPersistor().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_advanced_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_advanced_watchdog.html
index b09f579353..8f931521fe 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_advanced_watchdog.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_advanced_watchdog.html
@@ -1407,7 +1407,7 @@ Here is the call graph for this function:
abstract Task FinishActivationPreparation(CancellationToken cancellationToken)
Should be awaited. before calling MakeActive(CancellationToken) to ensure the SwappableDmbProvider is...
Models.CompileJob CompileJob
The CompileJob of the .dmb.
bool Swapped
If MakeActive(CancellationToken) has been run.
-
+
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
ISessionController? Server
The single ISessionController.
DreamDaemonLaunchParameters ActiveLaunchParameters
The DreamDaemonLaunchParameters to be applied.
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html
index 9e1d7a06ed..57499e9afa 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_basic_watchdog.html
@@ -1142,7 +1142,7 @@ Here is the caller graph for this function:
async ValueTask< ISessionController > LaunchNew(IDmbProvider dmbProvider, IEngineExecutableLock? currentByondLock, DreamDaemonLaunchParameters launchParameters, bool apiValidate, CancellationToken cancellationToken)
Create a ISessionController from a freshly launch DreamDaemon instance. A ValueTask<TResult> resultin...
async ValueTask< ISessionController?> Reattach(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Create a ISessionController from an existing DreamDaemon instance. A ValueTask<TResult> resulting in ...
-
+
ValueTask Update(ReattachInformation reattachInformation, CancellationToken cancellationToken)
Update some reattachInformation . A ValueTask representing the running operation.
virtual ValueTask SessionStartupPersist(CancellationToken cancellationToken)
Called to save the current Server into the WatchdogBase.SessionPersistor when initially launched.
virtual ValueTask< IDmbProvider > PrepServerForLaunch(IDmbProvider dmbToUse, CancellationToken cancellationToken)
Prepare the server to launch a new instance with the WatchdogBase.ActiveLaunchParameters and a given ...
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html
index 9275f28f04..aebd989b02 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_base.html
@@ -681,7 +681,7 @@ Private Attributes
255 }
-
+
readonly IJobManager jobManager
The IJobManager for the WatchdogBase.
ILogger< WatchdogBase > Logger
The ILogger for the WatchdogBase.
bool releaseServers
If the servers should be released instead of shutdown.
@@ -3458,13 +3458,13 @@ Here is the caller graph for this function:
410 cancellationToken);
411 }
Metadata about a server instance.
-async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
+async ValueTask< ReattachInformation?> Load(CancellationToken cancellationToken)
Load a saved ReattachInformation. A ValueTask<TResult> resulting in the stored ReattachInformation if...
ValueTask UpdateTrackingContexts(CancellationToken cancellationToken)
Force an update with the active channels on all active IChatTrackingContexts.
ValueTask RegisterOperation(Job job, JobEntrypoint operation, CancellationToken cancellationToken)
Registers a given Job and begins running it.
JobCode
The different types of Response.JobResponse.
DreamDaemonRights
Rights for managing DreamDaemon.
-References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Chat, Tgstation.Server.Host.Components.Instance.DifferentCoreExceptionMessage, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchNoLock(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), Tgstation.Server.Host.Utils.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.metadata, Tgstation.Server.Host.Jobs.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.synchronizationSemaphore, and Tgstation.Server.Host.Components.Chat.IChatManager.UpdateTrackingContexts().
+References Tgstation.Server.Host.Components.Watchdog.WatchdogBase.autoStart, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.Chat, Tgstation.Server.Host.Components.Instance.DifferentCoreExceptionMessage, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.jobManager, Tgstation.Server.Host.Components.Watchdog.WatchdogBase.LaunchNoLock(), Tgstation.Server.Host.Components.Session.SessionPersistor.Load(), Tgstation.Server.Host.Utils.SemaphoreSlimContext.Lock(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.metadata, Tgstation.Server.Host.Jobs.IJobManager.RegisterOperation(), Tgstation.Server.Host.Components.Watchdog.WatchdogBase.synchronizationSemaphore, and Tgstation.Server.Host.Components.Chat.IChatManager.UpdateTrackingContexts().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html
index bf8804416a..fb1067fdb3 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html
@@ -207,7 +207,7 @@ Properties
Definition at line 20 of file DatabaseConfiguration.cs.
-
Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices(), Tgstation.Server.Host.Database.MySqlDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.PostgresSqlDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.SqliteDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.SqlServerDatabaseContext.ConfigureWith(), and Tgstation.Server.Host.Database.DatabaseSeeder.Downgrade().
+
Referenced by Tgstation.Server.Host.Core.Application.ConfigureServices(), Tgstation.Server.Host.Database.MySqlDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.PostgresSqlDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.SqliteDatabaseContext.ConfigureWith(), Tgstation.Server.Host.Database.SqlServerDatabaseContext.ConfigureWith(), and Tgstation.Server.Host.Database.DatabaseSeeder.Downgrade().
@@ -236,7 +236,7 @@ Properties
Definition at line 35 of file DatabaseConfiguration.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.Initialize().
+Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.Initialize().
@@ -265,7 +265,7 @@ Properties
Definition at line 25 of file DatabaseConfiguration.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.Initialize().
+Referenced by Tgstation.Server.Host.Database.DatabaseSeeder.Initialize().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html
index aa7c6465fe..dd4d1a89d2 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_general_configuration.html
@@ -718,7 +718,7 @@ Here is the caller graph for this function:
const uint DefaultByondTopicTimeout
The default value for ByondTopicTimeout.
-Referenced by Tgstation.Server.Host.Configuration.GeneralConfiguration.CheckCompatibility(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Database.DatabaseSeeder.SanitizeDatabase().
+Referenced by Tgstation.Server.Host.Configuration.GeneralConfiguration.CheckCompatibility(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Database.DatabaseSeeder.SanitizeDatabase().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html
index 7efbd9093a..fb364d5a8f 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html
@@ -351,7 +351,7 @@ Additional Inherited Members
- Returns
- A HttpStatusCode.Created ObjectResult with the given payload .
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.CreateDirectory(), and Tgstation.Server.Host.Controllers.RepositoryController.Read().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.CreateDirectory(), and Tgstation.Server.Host.Controllers.RepositoryController.Read().
@@ -1116,7 +1116,7 @@ Here is the caller graph for this function:
- Returns
- A StatusCodeResult with the given statusCode .
-Referenced by Tgstation.Server.Host.Controllers.AdministrationController.AttemptInitiateUpdate(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.AdministrationController.Delete(), Tgstation.Server.Host.Controllers.ApiController.HeadersIssue(), Tgstation.Server.Host.Controllers.ApiController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.Read(), and Tgstation.Server.Host.Controllers.ApiController.RequiresPosixSystemIdentity().
+Referenced by Tgstation.Server.Host.Controllers.AdministrationController.AttemptInitiateUpdate(), Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.AdministrationController.Delete(), Tgstation.Server.Host.Controllers.ApiController.HeadersIssue(), Tgstation.Server.Host.Controllers.ApiController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.Read(), and Tgstation.Server.Host.Controllers.ApiController.RequiresPosixSystemIdentity().
@@ -1475,7 +1475,7 @@ Here is the caller graph for this function:
Definition at line 71 of file ApiController.cs.
-Referenced by Tgstation.Server.Host.Controllers.ApiController.ApiController(), Tgstation.Server.Host.Controllers.AdministrationController.AttemptInitiateUpdate(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.CreateDirectory(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Controllers.AdministrationController.Delete(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.ConfigurationController.DeleteDirectory(), Tgstation.Server.Host.Controllers.ConfigurationController.Directory(), Tgstation.Server.Host.Controllers.ConfigurationController.File(), Tgstation.Server.Host.Controllers.ApiController.HookExecuteAction(), Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), Tgstation.Server.Host.Controllers.ApiController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.Read(), Tgstation.Server.Host.Controllers.ApiController.RequiresPosixSystemIdentity(), Tgstation.Server.Host.Controllers.ConfigurationController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.EngineController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.UserController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
+Referenced by Tgstation.Server.Host.Controllers.ApiController.ApiController(), Tgstation.Server.Host.Controllers.AdministrationController.AttemptInitiateUpdate(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ConfigurationController.CreateDirectory(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Controllers.AdministrationController.Delete(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.ConfigurationController.DeleteDirectory(), Tgstation.Server.Host.Controllers.ConfigurationController.Directory(), Tgstation.Server.Host.Controllers.ConfigurationController.File(), Tgstation.Server.Host.Controllers.ApiController.HookExecuteAction(), Tgstation.Server.Host.Controllers.RepositoryController.PopulateApi(), Tgstation.Server.Host.Controllers.ApiController.RateLimit(), Tgstation.Server.Host.Controllers.AdministrationController.Read(), Tgstation.Server.Host.Controllers.ApiController.RequiresPosixSystemIdentity(), Tgstation.Server.Host.Controllers.ConfigurationController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.EngineController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.UserController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html
index c9cbeef4e3..aaf3dd1914 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html
@@ -265,7 +265,7 @@ Additional Inherited Members
ApiController for managing ChatBots.
-
Definition at line 38 of file ChatController.cs.
+
Definition at line 36 of file ChatController.cs.
◆ ChatController()
@@ -323,15 +323,15 @@ Additional Inherited Members
-Definition at line 48 of file ChatController.cs.
- 54 : base(
-
55 databaseContext,
-
56 authenticationContext,
-
57 logger,
-
-
59 apiHeaders)
-
60 {
-
61 }
+
Definition at line 46 of file ChatController.cs.
+
52 : base(
+
53 databaseContext,
+
54 authenticationContext,
+
55 logger,
+
+
57 apiHeaders)
+
58 {
+
59 }
readonly IInstanceManager instanceManager
The IInstanceManager for the ComponentInterfacingController.
@@ -381,41 +381,41 @@ Additional Inherited Members
- Returns
- A ChatChannel based on api .
-Definition at line 69 of file ChatController.cs.
- 70 {
-
-
72 {
-
73 IsAdminChannel = api.IsAdminChannel ?? false,
-
74 IsWatchdogChannel = api.IsWatchdogChannel ?? false,
-
75 IsUpdatesChannel = api.IsUpdatesChannel ?? false,
-
76 IsSystemChannel = api.IsSystemChannel ?? false,
-
-
78 };
-
79
-
80 if (api.ChannelData != null)
-
81 {
-
82 switch (chatProvider)
-
83 {
-
-
85 result.DiscordChannelId = ulong.Parse(api.ChannelData, CultureInfo.InvariantCulture);
-
86 break;
-
-
88 result.IrcChannel = api.ChannelData;
-
89 break;
-
90 default:
-
91 throw new InvalidOperationException($"Invalid chat provider: {chatProvider}");
-
92 }
-
93 }
-
94
-
95 return result;
-
96 }
+
Definition at line 67 of file ChatController.cs.
+
68 {
+
+
70 {
+
71 IsAdminChannel = api.IsAdminChannel ?? false,
+
72 IsWatchdogChannel = api.IsWatchdogChannel ?? false,
+
73 IsUpdatesChannel = api.IsUpdatesChannel ?? false,
+
74 IsSystemChannel = api.IsSystemChannel ?? false,
+
+
76 };
+
77
+
78 if (api.ChannelData != null)
+
79 {
+
80 switch (chatProvider)
+
81 {
+
+
83 result.DiscordChannelId = ulong.Parse(api.ChannelData, CultureInfo.InvariantCulture);
+
84 break;
+
+
86 result.IrcChannel = api.ChannelData;
+
87 break;
+
88 default:
+
89 throw new InvalidOperationException($"Invalid chat provider: {chatProvider}");
+
90 }
+
91 }
+
92
+
93 return result;
+
94 }
Indicates a chat channel.
string? Tag
A custom tag users can define to group channels together.
ChatProvider
Represents a chat service provider.
References Tgstation.Server.Api.Models.Internal.ChatChannelBase.Tag.
-
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().
@@ -466,69 +466,69 @@ Here is the caller graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult for the operation.
<response code="201">Created ChatBot successfully.</response>
-
Definition at line 108 of file ChatController.cs.
-
109 {
-
110 ArgumentNullException.ThrowIfNull(model);
-
111
-
-
113 if (earlyOut != null)
-
114 return earlyOut;
-
115
-
-
-
118 .AsQueryable()
-
-
120 .CountAsync(cancellationToken);
-
121
-
-
-
124
-
125 model.Enabled ??= false;
-
126 model.ReconnectionInterval ??= 1;
-
127
-
128
-
-
130 var dbModel =
new ChatBot(newChannels)
-
131 {
-
-
-
-
-
-
-
-
139 };
+
Definition at line 106 of file ChatController.cs.
+
107 {
+
108 ArgumentNullException.ThrowIfNull(model);
+
109
+
+
111 if (earlyOut != null)
+
112 return earlyOut;
+
113
+
+
+
116 .AsQueryable()
+
+
118 .CountAsync(cancellationToken);
+
119
+
+
+
122
+
123 model.Enabled ??= false;
+
124 model.ReconnectionInterval ??= 1;
+
125
+
126
+
+
128 var dbModel =
new ChatBot(newChannels)
+
129 {
+
+
+
+
+
+
+
+
137 };
+
138
+
140
-
-
142
-
-
-
145 async instance =>
-
146 {
-
147 try
-
148 {
-
149
-
150 await instance.Chat.ChangeSettings(dbModel, cancellationToken);
-
151
-
152 if (dbModel.Channels.Count > 0)
-
153 await instance.Chat.ChangeChannels(dbModel.Id!.Value, dbModel.Channels, cancellationToken);
-
154 }
-
155 catch
-
156 {
-
157
-
-
159
-
160
-
-
162 await instance.Chat.DeleteConnection(dbModel.Id!.Value, default);
-
163 throw;
-
164 }
-
165
-
166 return null;
-
167 })
-
168
-
169 ?? this.
StatusCode(HttpStatusCode.Created, dbModel.ToApi());
-
170 }
+
+
+
143 async instance =>
+
144 {
+
145 try
+
146 {
+
147
+
148 await instance.Chat.ChangeSettings(dbModel, cancellationToken);
+
149
+
150 if (dbModel.Channels.Count > 0)
+
151 await instance.Chat.ChangeChannels(dbModel.Id!.Value, dbModel.Channels, cancellationToken);
+
152 }
+
153 catch
+
154 {
+
155
+
+
157
+
158
+
+
160 await instance.Chat.DeleteConnection(dbModel.Id!.Value, default);
+
161 throw;
+
162 }
+
163
+
164 return null;
+
165 })
+
166
+
167 ?? this.
StatusCode(HttpStatusCode.Created, dbModel.ToApi());
+
168 }
virtual ? long Id
The ID of the entity.
Metadata about a server instance.
ushort? ChatBotLimit
The maximum number of chat bots the Instance may contain.
@@ -541,9 +541,9 @@ Here is the caller graph for this function:
virtual ? string Name
The name of the entity represented by the NamedEntity.
Represents an error message returned by the server.
StatusCodeResult StatusCode(HttpStatusCode statusCode)
Strongly type calls to ControllerBase.StatusCode(int).
-
static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api, ChatProvider chatProvider)
Converts api to a ChatChannel.
-
BadRequestObjectResult? StandardModelChecks(ChatBotApiBase model, bool forCreation)
Perform some basic validation of a given model .
-
ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List ChatBots.
+
static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api, ChatProvider chatProvider)
Converts api to a ChatChannel.
+
BadRequestObjectResult? StandardModelChecks(ChatBotApiBase model, bool forCreation)
Perform some basic validation of a given model .
+
ValueTask< IActionResult > List([FromQuery] int? page, [FromQuery] int? pageSize, CancellationToken cancellationToken)
List ChatBots.
async ValueTask< IActionResult?> WithComponentInstanceNullable(Func< IInstanceCore, ValueTask< IActionResult?> > action, Models.Instance? instance=null)
Run a given action with the relevant IInstance.
Backend abstract implementation of IDatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
@@ -551,7 +551,7 @@ Here is the caller graph for this function:
ErrorCode
Types of Response.ErrorMessageResponses that the API may return.
-References Tgstation.Server.Api.Models.Instance.ChatBotLimit, Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Controllers.ApiController.StatusCode(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
+References Tgstation.Server.Api.Models.Instance.ChatBotLimit, Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), Tgstation.Server.Host.Controllers.ApiController.StatusCode(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
@@ -652,24 +652,24 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult for the operation.
<response code="200">Retrieved ChatBot successfully.</response> <response code="410">The ChatBot with the given ID does not exist in this instance.</response>
-Definition at line 245 of file ChatController.cs.
- 246 {
-
247 var query = DatabaseContext.ChatBots
-
248 .AsQueryable()
-
249 .Where(x => x.Id ==
id && x.InstanceId ==
Instance.
Id)
-
250 .Include(x => x.Channels);
-
251
-
252 var results = await query.FirstOrDefaultAsync(cancellationToken);
-
253 if (results == default)
-
254 return this.Gone();
+
Definition at line 243 of file ChatController.cs.
+
244 {
+
245 var query = DatabaseContext.ChatBots
+
246 .AsQueryable()
+
247 .Where(x => x.Id ==
id && x.InstanceId ==
Instance.
Id)
+
248 .Include(x => x.Channels);
+
249
+
250 var results = await query.FirstOrDefaultAsync(cancellationToken);
+
251 if (results == default)
+
252 return this.Gone();
+
253
+
255
-
-
257
-
258 if (!connectionStrings)
-
259 results.ConnectionString = null;
-
260
-
261 return Json(results.ToApi());
-
262 }
+
256 if (!connectionStrings)
+
257 results.ConnectionString = null;
+
258
+
259 return Json(results.ToApi());
+
260 }
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType . The value of rightsType . Note that if InstancePermissionSet is...
ChatBotRights
Rights for chat bots.
@@ -734,34 +734,34 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult for the operation.
<response code="200">Listed chat bots successfully.</response>
-
Definition at line 209 of file ChatController.cs.
-
210 {
-
-
212 return Paginated<ChatBot, ChatBotResponse>(
-
213 () => ValueTask.FromResult(
-
-
-
-
217 .AsQueryable()
-
-
219 .Include(x => x.Channels)
-
220 .OrderBy(x => x.Id))),
-
221 chatBot =>
-
222 {
-
223 if (!connectionStrings)
-
224 chatBot.ConnectionString = null;
-
225
-
226 return ValueTask.CompletedTask;
-
227 },
-
228 page,
-
229 pageSize,
-
230 cancellationToken);
-
231 }
+
Definition at line 207 of file ChatController.cs.
+
208 {
+
+
210 return Paginated<ChatBot, ChatBotResponse>(
+
211 () => ValueTask.FromResult(
+
+
+
+
215 .AsQueryable()
+
+
217 .Include(x => x.Channels)
+
218 .OrderBy(x => x.Id))),
+
219 chatBot =>
+
220 {
+
221 if (!connectionStrings)
+
222 chatBot.ConnectionString = null;
+
223
+
224 return ValueTask.CompletedTask;
+
225 },
+
226 page,
+
227 pageSize,
+
228 cancellationToken);
+
229 }
Helper for returning paginated models.
References Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), and Tgstation.Server.Api.Models.EntityId.Id.
-
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create().
+
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create().
@@ -829,38 +829,38 @@ Here is the caller graph for this function:
- Returns
- An BadRequestObjectResult to respond with or
null.
-
Definition at line 386 of file ChatController.cs.
-
387 {
-
-
389 throw new InvalidOperationException("RecconnectionInterval cannot be zero!");
-
390
-
391 if (forCreation && !model.
Provider.HasValue)
-
-
393
-
394 if (model.
Name !=
null && String.IsNullOrWhiteSpace(model.
Name))
-
-
396
-
-
-
399
-
-
-
402
-
-
404 if (defaultMaxChannels > UInt16.MaxValue)
-
-
406
-
407 if (forCreation)
-
408 model.ChannelLimit ??= (ushort)defaultMaxChannels;
-
409
-
410 return null;
-
411 }
+
Definition at line 384 of file ChatController.cs.
+
385 {
+
+
387 throw new InvalidOperationException("RecconnectionInterval cannot be zero!");
+
388
+
389 if (forCreation && !model.
Provider.HasValue)
+
+
391
+
392 if (model.
Name !=
null && String.IsNullOrWhiteSpace(model.
Name))
+
+
394
+
+
+
397
+
+
+
400
+
+
402 if (defaultMaxChannels > UInt16.MaxValue)
+
+
404
+
405 if (forCreation)
+
406 model.ChannelLimit ??= (ushort)defaultMaxChannels;
+
407
+
408 return null;
+
409 }
bool ValidateProviderChannelTypes()
Validates Channels are correct for the ChatBotSettings.Provider.
const ushort DefaultChannelLimit
Default for Api.Models.Internal.ChatBotSettings.ChannelLimit.
References Tgstation.Server.Api.Models.Internal.ChatBotApiBase.Channels, Tgstation.Server.Api.Models.Internal.ChatBotSettings.ConnectionString, Tgstation.Server.Host.Models.ChatBot.DefaultChannelLimit, Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Api.Models.Internal.ChatBotSettings.Provider, Tgstation.Server.Api.Models.Internal.ChatBotSettings.ReconnectionInterval, and Tgstation.Server.Api.Models.Internal.ChatBotApiBase.ValidateProviderChannelTypes().
-
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), and Tgstation.Server.Host.Controllers.ChatController.Update().
@@ -920,108 +920,108 @@ Here is the caller graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult for the operation.
<response code="200">Update applied successfully.</response> <response code="204">Update applied successfully. ChatBot not returned based on user permissions.</response> <response code="410">The ChatBot with the given ID does not exist in this instance.</response>
-
Definition at line 279 of file ChatController.cs.
-
281 {
-
282 ArgumentNullException.ThrowIfNull(model);
-
283
-
-
285 if (earlyOut != null)
-
286 return earlyOut;
-
287
-
-
-
290 .AsQueryable()
-
291 .Where(x => x.InstanceId ==
Instance.
Id && x.Id == model.
Id)
-
292 .Include(x => x.Channels);
+
Definition at line 277 of file ChatController.cs.
+
279 {
+
280 ArgumentNullException.ThrowIfNull(model);
+
281
+
+
283 if (earlyOut != null)
+
284 return earlyOut;
+
285
+
+
+
288 .AsQueryable()
+
289 .Where(x => x.InstanceId ==
Instance.
Id && x.Id == model.
Id)
+
290 .Include(x => x.Channels);
+
291
+
292 var current = await query.FirstOrDefaultAsync(cancellationToken);
293
-
294 var current = await query.FirstOrDefaultAsync(cancellationToken);
-
295
-
296 if (current == default)
-
297 return this.Gone();
-
298
-
299 if ((model.
Channels?.Count ?? current.Channels!.Count) > (model.
ChannelLimit ?? current.ChannelLimit!.Value))
-
300 {
-
301
-
-
-
304 return BadRequest(errorMessage);
-
305 return Conflict(errorMessage);
-
306 }
+
294 if (current == default)
+
295 return this.Gone();
+
296
+
297 if ((model.
Channels?.Count ?? current.Channels!.Count) > (model.
ChannelLimit ?? current.ChannelLimit!.Value))
+
298 {
+
299
+
+
+
302 return BadRequest(errorMessage);
+
303 return Conflict(errorMessage);
+
304 }
+
305
+
307
-
+
308 bool anySettingsModified = false;
309
-
310 bool anySettingsModified = false;
-
311
-
312 bool CheckModified<T>(Expression<Func<ChatBotSettings, T>> expression,
ChatBotRights requiredRight)
-
313 {
-
314 var memberSelectorExpression = (MemberExpression)expression.Body;
-
315 var property = (PropertyInfo)memberSelectorExpression.Member;
-
316
-
317 var newVal = property.GetValue(model);
-
318 if (newVal == null)
-
319 return false;
-
320 if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
-
321 return true;
-
322
-
323 property.SetValue(current, newVal);
-
324 anySettingsModified = true;
-
325 return false;
-
326 }
+
310 bool CheckModified<T>(Expression<Func<ChatBotSettings, T>> expression,
ChatBotRights requiredRight)
+
311 {
+
312 var memberSelectorExpression = (MemberExpression)expression.Body;
+
313 var property = (PropertyInfo)memberSelectorExpression.Member;
+
314
+
315 var newVal = property.GetValue(model);
+
316 if (newVal == null)
+
317 return false;
+
318 if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
+
319 return true;
+
320
+
321 property.SetValue(current, newVal);
+
322 anySettingsModified = true;
+
323 return false;
+
324 }
+
325
+
326 var oldProvider = current.Provider;
327
-
328 var oldProvider = current.Provider;
-
329
-
330 if (CheckModified(x => x.ConnectionString,
ChatBotRights.WriteConnectionString)
-
-
-
333 || CheckModified(x => x.Provider,
ChatBotRights.WriteProvider)
-
334 || CheckModified(x => x.ReconnectionInterval,
ChatBotRights.WriteReconnectionInterval)
-
335 || CheckModified(x => x.ChannelLimit,
ChatBotRights.WriteChannelLimit)
-
336 || (model.Channels !=
null && !userRights.HasFlag(
ChatBotRights.WriteChannels)))
-
337 return Forbid();
-
338
-
339 var hasChannels = model.Channels != null;
-
340 if (hasChannels || (model.
Provider.HasValue && model.
Provider != oldProvider))
-
341 {
-
-
343 if (hasChannels)
-
344 {
-
-
-
347 current.Channels = dbChannels;
-
348 }
-
349 else
-
350 current.Channels!.Clear();
-
351 }
+
328 if (CheckModified(x => x.ConnectionString,
ChatBotRights.WriteConnectionString)
+
+
+
331 || CheckModified(x => x.Provider,
ChatBotRights.WriteProvider)
+
332 || CheckModified(x => x.ReconnectionInterval,
ChatBotRights.WriteReconnectionInterval)
+
333 || CheckModified(x => x.ChannelLimit,
ChatBotRights.WriteChannelLimit)
+
334 || (model.Channels !=
null && !userRights.HasFlag(
ChatBotRights.WriteChannels)))
+
335 return Forbid();
+
336
+
337 var hasChannels = model.Channels != null;
+
338 if (hasChannels || (model.
Provider.HasValue && model.
Provider != oldProvider))
+
339 {
+
+
341 if (hasChannels)
+
342 {
+
+
+
345 current.Channels = dbChannels;
+
346 }
+
347 else
+
348 current.Channels!.Clear();
+
349 }
+
350
+
352
-
-
354
-
-
356 async instance =>
-
357 {
-
358 var chat = instance.Chat;
-
359 if (anySettingsModified)
-
360 await chat.ChangeSettings(current, cancellationToken);
-
361
-
362 if ((model.
Channels !=
null || anySettingsModified) && current.Enabled!.Value)
-
363 await chat.ChangeChannels(current.Id!.Value, current.Channels, cancellationToken);
-
364
-
365 return null;
-
366 });
-
367 if (earlyOut != null)
-
368 return earlyOut;
-
369
-
-
371 {
-
-
373 current.ConnectionString = null;
-
374 return Json(current.ToApi());
-
375 }
-
376
-
377 return NoContent();
-
378 }
+
+
354 async instance =>
+
355 {
+
356 var chat = instance.Chat;
+
357 if (anySettingsModified)
+
358 await chat.ChangeSettings(current, cancellationToken);
+
359
+
360 if ((model.
Channels !=
null || anySettingsModified) && current.Enabled!.Value)
+
361 await chat.ChangeChannels(current.Id!.Value, current.Channels, cancellationToken);
+
362
+
363 return null;
+
364 });
+
365 if (earlyOut != null)
+
366 return earlyOut;
+
367
+
+
369 {
+
+
371 current.ConnectionString = null;
+
372 return Json(current.ToApi());
+
373 }
+
374
+
375 return NoContent();
+
376 }
DbSet< ChatChannel > ChatChannels
The ChatChannels in the DatabaseContext.
-
References Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Database.DatabaseContext.ChatChannels, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
+
References Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Database.DatabaseContext.ChatChannels, Tgstation.Server.Host.Controllers.ChatController.ConvertApiChatChannel(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.ChatController.StandardModelChecks(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_component_interfacing_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_component_interfacing_controller.html
index 620c5cf61d..536a3f61aa 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_component_interfacing_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_component_interfacing_controller.html
@@ -393,7 +393,7 @@ Additional Inherited Members
References Tgstation.Server.Host.Components.IInstanceManager.GetInstanceReference(), Tgstation.Server.Host.Controllers.ComponentInterfacingController.instanceManager, and Tgstation.Server.Host.Controllers.ApiController.Logger.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateRequest().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateRequest().
@@ -628,7 +628,7 @@ Here is the caller graph for this function:
References Tgstation.Server.Host.Components.IInstanceManager.GetInstanceReference(), Tgstation.Server.Host.Controllers.ComponentInterfacingController.instanceManager, and Tgstation.Server.Host.Utils.SerilogContextHelper.InstanceReferenceContextProperty.
-
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), and Tgstation.Server.Host.Controllers.RepositoryController.Update().
@@ -735,7 +735,7 @@ Here is the caller graph for this function:
Definition at line 27 of file ComponentInterfacingController.cs.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Update().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html
index 2af800cc86..e198de4fcd 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html
@@ -487,14 +487,14 @@ Additional Inherited Members
- Returns
- A ValueTask representing the running operation.
-
Definition at line 812 of file InstanceController.cs.
-
813 {
-
-
-
816 .AsQueryable()
-
-
818 .AnyAsync(cancellationToken);
-
819 }
+
Definition at line 838 of file InstanceController.cs.
+
839 {
+
+
+
842 .AsQueryable()
+
+
844 .AnyAsync(cancellationToken);
+
845 }
virtual ? long Id
The ID of the entity.
Backend abstract implementation of IDatabaseContext.
@@ -504,7 +504,7 @@ Additional Inherited Members
References Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Api.Models.PermissionSet.Id, Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, and Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -686,9 +686,9 @@ Here is the caller graph for this function:
ObjectResult Created(object payload)
Generic 201 response with a given payload .
ILogger< ApiController > Logger
The ILogger for the ApiController.
-
async ValueTask< Models.Instance?> CreateDefaultInstance(InstanceCreateRequest initialSettings, CancellationToken cancellationToken)
Creates a default Models.Instance from initialSettings .
-
BadRequestObjectResult? ValidateCronSetting(Api.Models.Instance instance)
Validates a given instance 's Api.Models.Instance.AutoUpdateCron setting.
-
string? NormalizePath(string? path)
Normalize a given path for an instance.
+
async ValueTask< Models.Instance?> CreateDefaultInstance(InstanceCreateRequest initialSettings, CancellationToken cancellationToken)
Creates a default Models.Instance from initialSettings .
+
BadRequestObjectResult? ValidateCronSetting(Api.Models.Instance instance)
Validates a given instance 's Api.Models.Instance.AutoUpdateCron setting.
+
string? NormalizePath(string? path)
Normalize a given path for an instance.
const string InstanceAttachFileName
File name to allow attaching instances.
DbSet< Instance > Instances
The Instances in the DatabaseContext.
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext. A Task representing the running operation.
@@ -706,7 +706,7 @@ Here is the caller graph for this function:
ValueTask InstancePermissionSetCreated(InstancePermissionSet instancePermissionSet, CancellationToken cancellationToken)
Called when a given instancePermissionSet is successfully created.
ErrorCode
Types of Response.ErrorMessageResponses that the API may return.
-References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.DefaultIOManager.CurrentDirectory, Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Controllers.InstanceController.generalConfiguration, Tgstation.Server.Host.IO.IIOManager.GetDirectories(), Tgstation.Server.Host.IO.IIOManager.GetFiles(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Api.Models.Internal.ServerInformationBase.InstanceLimit, Tgstation.Server.Host.Security.IPermissionsUpdateNotifyee.InstancePermissionSetCreated(), Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.Models.UserName.Name, Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), Tgstation.Server.Host.IO.IIOManager.PathIsChildOf(), Tgstation.Server.Host.Controllers.InstanceController.permissionsUpdateNotifyee, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, Tgstation.Server.Host.Security.AuthenticationContext.User, Tgstation.Server.Host.Controllers.InstanceController.ValidateCronSetting(), and Tgstation.Server.Api.Models.Internal.ServerInformationBase.ValidInstancePaths.
+References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.IO.IIOManager.CreateDirectory(), Tgstation.Server.Host.IO.DefaultIOManager.CurrentDirectory, Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Controllers.InstanceController.generalConfiguration, Tgstation.Server.Host.IO.IIOManager.GetDirectories(), Tgstation.Server.Host.IO.IIOManager.GetFiles(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Api.Models.Internal.ServerInformationBase.InstanceLimit, Tgstation.Server.Host.Security.IPermissionsUpdateNotifyee.InstancePermissionSetCreated(), Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.Models.UserName.Name, Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), Tgstation.Server.Host.IO.IIOManager.PathIsChildOf(), Tgstation.Server.Host.Controllers.InstanceController.permissionsUpdateNotifyee, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, Tgstation.Server.Host.Security.AuthenticationContext.User, Tgstation.Server.Host.Controllers.InstanceController.ValidateCronSetting(), and Tgstation.Server.Api.Models.Internal.ServerInformationBase.ValidInstancePaths.
@@ -780,87 +780,87 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the new Models.Instance or
null if ports could not be allocated.
-Definition at line 688 of file InstanceController.cs.
- 689 {
-
-
691 if (!ddPort.HasValue)
-
692 return null;
-
693
-
694
-
695 const ushort DefaultDreamDaemonPort = 1337;
-
696 if (ddPort.Value < DefaultDreamDaemonPort)
-
-
698
-
699 const ushort DefaultApiValidationPort = 1339;
-
-
-
702 Math.Min((ushort)(ddPort.Value + 1), DefaultApiValidationPort),
-
703 false,
-
704 cancellationToken);
-
705 if (!dmPort.HasValue)
-
706 return null;
-
707
-
708
-
709 if (dmPort < DefaultApiValidationPort)
-
-
711
-
-
713 {
-
-
-
716 {
-
717 AllowWebClient = false,
-
718 AutoStart = false,
-
719 Port = ddPort,
-
720 OpenDreamTopicPort = 0,
-
-
-
723 StartupTimeout = 60,
-
724 HealthCheckSeconds = 60,
-
725 DumpOnHealthCheckRestart = false,
-
-
727 AdditionalParameters = String.Empty,
-
728 StartProfiler = false,
-
729 LogOutput = false,
-
730 MapThreads = 0,
-
731 Minidumps = true,
-
732 },
-
-
734 {
-
735 ApiValidationPort = dmPort,
-
-
737 RequireDMApiValidation = true,
-
738 Timeout = TimeSpan.FromHours(1),
-
739 CompilerAdditionalArguments = null,
-
740 },
-
741 Name = initialSettings.
Name,
-
742 Online = false,
-
743 Path = initialSettings.
Path,
-
744 AutoUpdateInterval = initialSettings.AutoUpdateInterval ?? 0,
-
745 AutoUpdateCron = initialSettings.AutoUpdateCron ?? String.Empty,
-
746 ChatBotLimit = initialSettings.ChatBotLimit ?? Models.Instance.DefaultChatBotLimit,
-
-
748 {
-
749 CommitterEmail = Components.Repository.Repository.DefaultCommitterEmail,
-
750 CommitterName = Components.Repository.Repository.DefaultCommitterName,
-
751 PushTestMergeCommits = false,
-
752 ShowTestMergeCommitters = false,
-
753 AutoUpdatesKeepTestMerges = false,
-
754 AutoUpdatesSynchronize = false,
-
755 PostTestMergeComment = false,
-
756 CreateGitHubDeployments = false,
-
757 UpdateSubmodules = true,
+
Definition at line 714 of file InstanceController.cs.
+
715 {
+
+
717 if (!ddPort.HasValue)
+
718 return null;
+
719
+
720
+
721 const ushort DefaultDreamDaemonPort = 1337;
+
722 if (ddPort.Value < DefaultDreamDaemonPort)
+
+
724
+
725 const ushort DefaultApiValidationPort = 1339;
+
+
+
728 Math.Min((ushort)(ddPort.Value + 1), DefaultApiValidationPort),
+
729 false,
+
730 cancellationToken);
+
731 if (!dmPort.HasValue)
+
732 return null;
+
733
+
734
+
735 if (dmPort < DefaultApiValidationPort)
+
+
737
+
+
739 {
+
+
+
742 {
+
743 AllowWebClient = false,
+
744 AutoStart = false,
+
745 Port = ddPort,
+
746 OpenDreamTopicPort = 0,
+
+
+
749 StartupTimeout = 60,
+
750 HealthCheckSeconds = 60,
+
751 DumpOnHealthCheckRestart = false,
+
+
753 AdditionalParameters = String.Empty,
+
754 StartProfiler = false,
+
755 LogOutput = false,
+
756 MapThreads = 0,
+
757 Minidumps = true,
758 },
-
759 InstancePermissionSets = new List<InstancePermissionSet>
+
760 {
-
-
762 },
-
-
764 };
-
765 }
+
761 ApiValidationPort = dmPort,
+
+
763 RequireDMApiValidation = true,
+
764 Timeout = TimeSpan.FromHours(1),
+
765 CompilerAdditionalArguments = null,
+
766 },
+
767 Name = initialSettings.
Name,
+
768 Online = false,
+
769 Path = initialSettings.
Path,
+
770 AutoUpdateInterval = initialSettings.AutoUpdateInterval ?? 0,
+
771 AutoUpdateCron = initialSettings.AutoUpdateCron ?? String.Empty,
+
772 ChatBotLimit = initialSettings.ChatBotLimit ?? Models.Instance.DefaultChatBotLimit,
+
+
774 {
+
775 CommitterEmail = Components.Repository.Repository.DefaultCommitterEmail,
+
776 CommitterName = Components.Repository.Repository.DefaultCommitterName,
+
777 PushTestMergeCommits = false,
+
778 ShowTestMergeCommitters = false,
+
779 AutoUpdatesKeepTestMerges = false,
+
780 AutoUpdatesSynchronize = false,
+
781 PostTestMergeComment = false,
+
782 CreateGitHubDeployments = false,
+
783 UpdateSubmodules = true,
+
784 },
+
785 InstancePermissionSets = new List<InstancePermissionSet>
+
786 {
+
+
788 },
+
+
790 };
+
791 }
Metadata about a server instance.
uint ByondTopicTimeout
The timeout in milliseconds for sending and receiving topics to/from DreamDaemon. Note that a single ...
-
InstancePermissionSet InstanceAdminPermissionSet(InstancePermissionSet? permissionSetToModify)
Generate an InstancePermissionSet with full rights.
+
InstancePermissionSet InstanceAdminPermissionSet(InstancePermissionSet? permissionSetToModify)
Generate an InstancePermissionSet with full rights.
@@ -869,7 +869,7 @@ Here is the call graph for this function:
ConfigurationType
The type of configuration allowed on an Instance.
DreamDaemonSecurity
DreamDaemon's security level.
-References Tgstation.Server.Host.Configuration.GeneralConfiguration.ByondTopicTimeout, Tgstation.Server.Host.Controllers.InstanceController.generalConfiguration, Tgstation.Server.Host.Utils.IPortAllocator.GetAvailablePort(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminPermissionSet(), Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Api.Models.Instance.Path, Tgstation.Server.Host.Controllers.InstanceController.portAllocator, and Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration.
+References Tgstation.Server.Host.Configuration.GeneralConfiguration.ByondTopicTimeout, Tgstation.Server.Host.Controllers.InstanceController.generalConfiguration, Tgstation.Server.Host.Utils.IPortAllocator.GetAvailablePort(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminPermissionSet(), Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Api.Models.Instance.Path, Tgstation.Server.Host.Controllers.InstanceController.portAllocator, and Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration.
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create().
285 if (originalModel.Online!.Value)
287
-
- 289
- 290 var originalPath = originalModel.Path!;
-
- 292 try
- 293 {
-
-
- 296 }
- 297 catch (OperationCanceledException)
- 298 {
- 299
-
- 301 throw;
- 302 }
- 303
-
- 305 return NoContent();
- 306 }
+ 288 var originalPath = originalModel.Path!;
+
+ 290 try
+ 291 {
+
+
+ 294 }
+ 295 catch (OperationCanceledException)
+ 296 {
+ 297
+
+ 299 throw;
+ 300 }
+ 301
+ 302 try
+ 303 {
+ 304
+ 305
+
+
+ 308 .AsQueryable()
+ 309 .Where(x => x.Job!.Instance!.Id == id)
+ 310 .ExecuteDeleteAsync(cancellationToken);
+
+
+ 313 .AsQueryable()
+ 314 .Where(x => x.RevisionInformation.InstanceId == id)
+ 315 .ExecuteDeleteAsync(cancellationToken);
+
+
+ 318 .AsQueryable()
+ 319 .Where(x => x.InstanceId == id)
+ 320 .ExecuteDeleteAsync(cancellationToken);
+ 321
+
+
+ 324 }
+ 325 catch
+ 326 {
+
+ 328 throw;
+ 329 }
+ 330
+ 331 return NoContent();
+ 332 }
+DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext.
+DbSet< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges in the DatabaseContext.
+DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the DatabaseContext.
ValueTask WriteAllBytes(string path, byte[] contents, CancellationToken cancellationToken)
Writes some contents to a file at path overwriting previous content.
-References Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().
+References Tgstation.Server.Host.Database.DatabaseContext.CompileJobs, Tgstation.Server.Host.IO.IIOManager.ConcatPath(), Tgstation.Server.Host.IO.IIOManager.DeleteFile(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAttachFileName, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Database.DatabaseContext.RevInfoTestMerges, Tgstation.Server.Host.Database.DatabaseContext.RevisionInformations, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.IO.IIOManager.WriteAllBytes().
@@ -1018,56 +1047,56 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">Retrieved Api.Models.Instance successfully.</response> <response code="410">The database entity for the requested instance could not be retrieved. The instance was likely detached.</response>
-Definition at line 591 of file InstanceController.cs.
- 592 {
-
-
-
595 {
-
-
-
598 .AsQueryable()
-
-
600
-
601 if (cantList)
-
602 query = query.Include(x => x.InstancePermissionSets);
-
603 return query;
-
604 }
-
605
-
606 var instance = await QueryForUser().FirstOrDefaultAsync(cancellationToken);
-
607
-
608 if (instance == null)
-
609 return this.Gone();
-
610
-
-
-
613
-
-
-
-
-
-
-
-
-
622 return Forbid();
-
623
-
624 var api = instance.ToApi();
-
625
-
626 var moveJob = await QueryForUser()
-
627 .SelectMany(x => x.Jobs)
-
628 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
-
629 .Include(x => x.StartedBy!)
-
630 .ThenInclude(x => x.CreatedBy)
-
631 .Include(x => x.Instance)
-
632 .FirstOrDefaultAsync(cancellationToken);
-
633 api.MoveJob = moveJob?.ToApi();
-
-
635 return Json(api);
-
636 }
+
Definition at line 617 of file InstanceController.cs.
+
618 {
+
+
+
621 {
+
+
+
624 .AsQueryable()
+
+
626
+
627 if (cantList)
+
628 query = query.Include(x => x.InstancePermissionSets);
+
629 return query;
+
630 }
+
631
+
632 var instance = await QueryForUser().FirstOrDefaultAsync(cancellationToken);
+
633
+
634 if (instance == null)
+
635 return this.Gone();
+
636
+
+
+
639
+
+
+
+
+
+
+
+
+
648 return Forbid();
+
649
+
650 var api = instance.ToApi();
+
651
+
652 var moveJob = await QueryForUser()
+
653 .SelectMany(x => x.Jobs)
+
654 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+
655 .Include(x => x.StartedBy!)
+
656 .ThenInclude(x => x.CreatedBy)
+
657 .Include(x => x.Instance)
+
658 .FirstOrDefaultAsync(cancellationToken);
+
659 api.MoveJob = moveJob?.ToApi();
+
+
661 return Json(api);
+
662 }
InstanceManagerRights? InstanceManagerRights
The Rights.InstanceManagerRights for the user.
bool ValidateInstanceOnlineStatus(Api.Models.Instance metadata)
Corrects discrepencies between the Api.Models.Instance.Online status of IInstances in the database vs...
-
async ValueTask CheckAccessible(InstanceResponse instanceResponse, CancellationToken cancellationToken)
Populate the InstanceResponse.Accessible property of a given instanceResponse .
+
async ValueTask CheckAccessible(InstanceResponse instanceResponse, CancellationToken cancellationToken)
Populate the InstanceResponse.Accessible property of a given instanceResponse .
JobCode
The different types of Response.JobResponse.
ChatBotRights
Rights for chat bots.
ConfigurationRights
Rights for Models.IConfigurationFiles.
@@ -1078,7 +1107,7 @@ Here is the call graph for this function:
DreamDaemonRights
Rights for managing DreamDaemon.
InstanceManagerRights
Rights for managing Models.Instances.
-References Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
+References Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
@@ -1131,40 +1160,40 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="204">Granted permissions successfully.</response>
-Definition at line 649 of file InstanceController.cs.
- 650 {
-
-
-
653 .AsQueryable()
-
-
655
-
656
-
657 var usersInstancePermissionSet = await BaseQuery()
-
658 .SelectMany(x => x.InstancePermissionSets)
-
-
660 .FirstOrDefaultAsync(cancellationToken);
-
661 if (usersInstancePermissionSet == default)
-
662 {
-
663
-
664 var instanceExists = await BaseQuery()
-
665 .AnyAsync(cancellationToken);
-
666
-
667 if (!instanceExists)
-
668 return this.Gone();
-
669
-
-
671 instanceAdminUser.InstanceId = id;
-
-
673 }
-
674 else
-
-
676
-
-
678
-
679 return NoContent();
-
680 }
+
Definition at line 675 of file InstanceController.cs.
+
676 {
+
+
+
679 .AsQueryable()
+
+
681
+
682
+
683 var usersInstancePermissionSet = await BaseQuery()
+
684 .SelectMany(x => x.InstancePermissionSets)
+
+
686 .FirstOrDefaultAsync(cancellationToken);
+
687 if (usersInstancePermissionSet == default)
+
688 {
+
689
+
690 var instanceExists = await BaseQuery()
+
691 .AnyAsync(cancellationToken);
+
692
+
693 if (!instanceExists)
+
694 return this.Gone();
+
695
+
+
697 instanceAdminUser.InstanceId = id;
+
+
699 }
+
700 else
+
+
702
+
+
704
+
705 return NoContent();
+
706 }
-
References Tgstation.Server.Api.Models.PermissionSet.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminPermissionSet(), Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration.
+
References Tgstation.Server.Api.Models.PermissionSet.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Host.Controllers.InstanceController.InstanceAdminPermissionSet(), Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration.
@@ -1211,29 +1240,29 @@ Here is the call graph for this function:
- Returns
- permissionSetToModify or a new InstancePermissionSet with full rights.
-
Definition at line 772 of file InstanceController.cs.
-
773 {
-
-
775 {
-
-
-
778 };
-
-
-
-
-
-
-
-
786 return permissionSetToModify;
-
787 }
+
Definition at line 798 of file InstanceController.cs.
+
799 {
+
+
801 {
+
+
+
804 };
+
+
+
+
+
+
+
+
812 return permissionSetToModify;
+
813 }
Represents a set of server permissions.
References Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions().
@@ -1292,62 +1321,62 @@ Here is the caller graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">Retrieved Api.Models.Instances successfully.</response>
-
Definition at line 523 of file InstanceController.cs.
-
527 {
-
-
529 {
-
-
-
532 .AsQueryable()
-
-
-
535 query = query
-
-
537 .Where(x => x.InstancePermissionSets.Any(instanceUser =>
-
-
-
-
-
-
-
544
-
545
-
546 return query.Select(x => x);
-
547 }
-
548
-
549 var moveJobs = await GetBaseQuery()
-
550 .SelectMany(x => x.Jobs)
-
551 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
-
552 .Include(x => x.StartedBy!)
-
553 .ThenInclude(x => x.CreatedBy)
-
554 .Include(x => x.Instance)
-
555 .ToListAsync(cancellationToken);
-
556
-
557 var needsUpdate = false;
-
-
559 () => ValueTask.FromResult(
-
-
561 GetBaseQuery()
-
562 .OrderBy(x => x.Id))),
-
563 async instance =>
-
564 {
-
-
566 instance.MoveJob = moveJobs.FirstOrDefault(x => x.Instance!.Id == instance.Id)?.ToApi();
-
-
568 },
-
569 page,
-
570 pageSize,
-
571 cancellationToken);
-
572
-
573 if (needsUpdate)
-
-
575
-
576 return result;
-
577 }
+
Definition at line 549 of file InstanceController.cs.
+
553 {
+
+
555 {
+
+
+
558 .AsQueryable()
+
+
+
561 query = query
+
+
563 .Where(x => x.InstancePermissionSets.Any(instanceUser =>
+
+
+
+
+
+
+
570
+
571
+
572 return query.Select(x => x);
+
573 }
+
574
+
575 var moveJobs = await GetBaseQuery()
+
576 .SelectMany(x => x.Jobs)
+
577 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+
578 .Include(x => x.StartedBy!)
+
579 .ThenInclude(x => x.CreatedBy)
+
580 .Include(x => x.Instance)
+
581 .ToListAsync(cancellationToken);
+
582
+
583 var needsUpdate = false;
+
+
585 () => ValueTask.FromResult(
+
+
587 GetBaseQuery()
+
588 .OrderBy(x => x.Id))),
+
589 async instance =>
+
590 {
+
+
592 instance.MoveJob = moveJobs.FirstOrDefault(x => x.Instance!.Id == instance.Id)?.ToApi();
+
+
594 },
+
595 page,
+
596 pageSize,
+
597 cancellationToken);
+
598
+
599 if (needsUpdate)
+
+
601
+
602 return result;
+
603 }
Server response for Instances.
Helper for returning paginated models.
-
References Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Api.Models.PermissionSet.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
+
References Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Api.Models.PermissionSet.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus().
@@ -1396,22 +1425,22 @@ Here is the call graph for this function:
- Returns
- The normalized path .
-
Definition at line 795 of file InstanceController.cs.
-
796 {
-
797 if (path == null)
-
798 return null;
-
799
-
-
-
802
-
803 return path;
-
804 }
+
Definition at line 821 of file InstanceController.cs.
+
822 {
+
823 if (path == null)
+
824 return null;
+
825
+
+
+
828
+
829 return path;
+
830 }
string ResolvePath()
Retrieve the full path of the current working directory.
References Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.System.IPlatformIdentifier.NormalizePath(), Tgstation.Server.Host.Controllers.InstanceController.platformIdentifier, and Tgstation.Server.Host.IO.IIOManager.ResolvePath().
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -1472,193 +1501,193 @@ Here is the caller graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">Instance updated successfully.</response> <response code="202">Instance updated successfully and relocation job created.</response> <response code="410">The database entity for the requested instance could not be retrieved. The instance was likely detached.</response>
-
Definition at line 323 of file InstanceController.cs.
-
324 {
-
325 ArgumentNullException.ThrowIfNull(model);
-
326
-
-
-
329 .AsQueryable()
-
-
331
-
332 var moveJob = await InstanceQuery()
-
333 .SelectMany(x => x.Jobs)
-
334 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
-
335 .Select(x =>
new Job(x.Id!.Value))
-
336 .FirstOrDefaultAsync(cancellationToken);
-
337
-
338 if (moveJob != null)
-
339 {
-
340
-
-
342 return Forbid();
-
-
344 }
-
345
-
346 var originalModel = await InstanceQuery()
-
347 .Include(x => x.RepositorySettings)
-
348 .Include(x => x.ChatSettings)
-
349 .ThenInclude(x => x.Channels)
-
350 .Include(x => x.DreamDaemonSettings)
-
351 .FirstOrDefaultAsync(cancellationToken);
-
352 if (originalModel == default(Models.Instance))
-
353 return this.Gone();
-
354
-
-
+
Definition at line 349 of file InstanceController.cs.
+
350 {
+
351 ArgumentNullException.ThrowIfNull(model);
+
352
+
+
+
355 .AsQueryable()
+
357
-
-
359 bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression,
InstanceManagerRights requiredRight)
-
360 {
-
361 var memberSelectorExpression = (MemberExpression)expression.Body;
-
362 var property = (PropertyInfo)memberSelectorExpression.Member;
+
358 var moveJob = await InstanceQuery()
+
359 .SelectMany(x => x.Jobs)
+
360 .Where(x => !x.StoppedAt.HasValue && x.JobCode ==
JobCode.Move)
+
361 .Select(x =>
new Job(x.Id!.Value))
+
362 .FirstOrDefaultAsync(cancellationToken);
363
-
364 var newVal = property.GetValue(model);
-
365 if (newVal == null)
-
366 return false;
-
367 if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
-
368 return true;
-
369
-
370 property.SetValue(originalModel, newVal);
-
371 return false;
-
372 }
-
373
-
374 string? originalModelPath = null;
-
375 string? normalizedPath = null;
-
376 var originalOnline = originalModel.Online!.Value;
-
377 if (model.
Path !=
null)
-
378 {
-
+
364 if (moveJob != null)
+
365 {
+
366
+
+
368 return Forbid();
+
+
370 }
+
371
+
372 var originalModel = await InstanceQuery()
+
373 .Include(x => x.RepositorySettings)
+
374 .Include(x => x.ChatSettings)
+
375 .ThenInclude(x => x.Channels)
+
376 .Include(x => x.DreamDaemonSettings)
+
377 .FirstOrDefaultAsync(cancellationToken);
+
378 if (originalModel == default(Models.Instance))
+
379 return this.Gone();
380
-
381 if (normalizedPath != originalModel.Path)
-
382 {
-
-
384 return Forbid();
-
385 if (originalOnline && model.
Online !=
true)
-
-
387
-
-
-
-
391
-
392 originalModelPath = originalModel.Path;
-
393 originalModel.Path = normalizedPath;
-
394 }
-
395 }
-
396
-
397 var oldAutoUpdateInterval = originalModel.AutoUpdateInterval!.Value;
-
398 var oldAutoUpdateCron = originalModel.AutoUpdateCron;
+
+
+
383
+
+
385 bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression,
InstanceManagerRights requiredRight)
+
386 {
+
387 var memberSelectorExpression = (MemberExpression)expression.Body;
+
388 var property = (PropertyInfo)memberSelectorExpression.Member;
+
389
+
390 var newVal = property.GetValue(model);
+
391 if (newVal == null)
+
392 return false;
+
393 if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
+
394 return true;
+
395
+
396 property.SetValue(originalModel, newVal);
+
397 return false;
+
398 }
399
-
-
401 if (earlyOut != null)
-
402 return earlyOut;
-
403
-
404 var changedAutoInterval = model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.
AutoUpdateInterval;
-
405 var changedAutoCron = model.AutoUpdateCron !=
null && oldAutoUpdateCron != model.
AutoUpdateCron;
+
400 string? originalModelPath = null;
+
401 string? normalizedPath = null;
+
402 var originalOnline = originalModel.Online!.Value;
+
403 if (model.
Path !=
null)
+
404 {
+
406
-
407 var renamed = model.Name !=
null && originalModel.Name != model.
Name;
-
408
-
-
-
-
-
-
-
415 return Forbid();
-
416
-
-
418 {
-
-
-
421 .AsQueryable()
-
422 .Where(x => x.InstanceId == originalModel.Id)
-
423 .CountAsync(cancellationToken);
-
424
-
-
-
427 }
-
428
-
429 if (changedAutoCron)
-
430 model.AutoUpdateInterval = 0;
-
431 else if (changedAutoInterval)
-
432 model.AutoUpdateCron = String.Empty;
-
433
-
-
435
-
436 if (renamed)
-
437 {
-
438
-
-
440 async componentInstance =>
-
441 {
-
442 await componentInstance.InstanceRenamed(originalModel.Name!, cancellationToken);
-
443 return null;
-
444 },
-
445 originalModel);
-
446 }
-
447
-
448 var oldAutoStart = originalModel.DreamDaemonSettings!.AutoStart;
-
449 try
-
450 {
-
451 if (originalOnline && model.
Online ==
false)
-
-
453 else if (!originalOnline && model.
Online ==
true)
-
454 {
-
455
-
456
-
457 originalModel.DreamDaemonSettings.AutoStart = false;
-
-
459 }
-
460 }
-
-
462 {
-
463 if (e is not OperationCanceledException)
-
464 Logger.LogError(e,
"Error changing instance online state!");
-
465 originalModel.Online = originalOnline;
-
466 originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
-
467 if (originalModelPath != null)
-
468 originalModel.Path = originalModelPath;
-
469
-
470
-
-
472 throw;
-
473 }
-
474
-
+
407 if (normalizedPath != originalModel.Path)
+
408 {
+
+
410 return Forbid();
+
411 if (originalOnline && model.
Online !=
true)
+
+
413
+
+
+
+
417
+
418 originalModelPath = originalModel.Path;
+
419 originalModel.Path = normalizedPath;
+
420 }
+
421 }
+
422
+
423 var oldAutoUpdateInterval = originalModel.AutoUpdateInterval!.Value;
+
424 var oldAutoUpdateCron = originalModel.AutoUpdateCron;
+
425
+
+
427 if (earlyOut != null)
+
428 return earlyOut;
+
429
+
430 var changedAutoInterval = model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.
AutoUpdateInterval;
+
431 var changedAutoCron = model.AutoUpdateCron !=
null && oldAutoUpdateCron != model.
AutoUpdateCron;
+
432
+
433 var renamed = model.Name !=
null && originalModel.Name != model.
Name;
+
434
+
+
+
+
+
+
+
441 return Forbid();
+
442
+
+
444 {
+
+
+
447 .AsQueryable()
+
448 .Where(x => x.InstanceId == originalModel.Id)
+
449 .CountAsync(cancellationToken);
+
450
+
+
+
453 }
+
454
+
455 if (changedAutoCron)
+
456 model.AutoUpdateInterval = 0;
+
457 else if (changedAutoInterval)
+
458 model.AutoUpdateCron = String.Empty;
+
459
+
+
461
+
462 if (renamed)
+
463 {
+
464
+
+
466 async componentInstance =>
+
467 {
+
468 await componentInstance.InstanceRenamed(originalModel.Name!, cancellationToken);
+
469 return null;
+
470 },
+
471 originalModel);
+
472 }
+
473
+
474 var oldAutoStart = originalModel.DreamDaemonSettings!.AutoStart;
+
475 try
476 {
-
477 Id = originalModel.
Id,
-
478 };
-
479
-
480 var moving = originalModelPath != null;
-
481 if (moving)
-
482 {
-
483 var description = $"Move instance ID {originalModel.Id} from {originalModelPath} to {normalizedPath}";
-
-
485 job.Description = description;
-
486
-
-
488 job,
-
489 (core, databaseContextFactory, paramJob, progressHandler, ct)
-
-
491 cancellationToken);
-
492 api.MoveJob = job.ToApi();
-
493 }
-
494
-
495 if (changedAutoInterval || changedAutoCron)
-
496 {
-
497
-
-
499 async componentInstance =>
-
500 {
-
-
502 return null;
-
503 },
-
504 originalModel);
-
505 }
-
506
-
-
508 return moving ? Accepted(api) : Json(api);
-
509 }
+
477 if (originalOnline && model.
Online ==
false)
+
+
479 else if (!originalOnline && model.
Online ==
true)
+
480 {
+
481
+
482
+
483 originalModel.DreamDaemonSettings.AutoStart = false;
+
+
485 }
+
486 }
+
+
488 {
+
489 if (e is not OperationCanceledException)
+
490 Logger.LogError(e,
"Error changing instance online state!");
+
491 originalModel.Online = originalOnline;
+
492 originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
+
493 if (originalModelPath != null)
+
494 originalModel.Path = originalModelPath;
+
495
+
496
+
+
498 throw;
+
499 }
+
500
+
+
502 {
+
503 Id = originalModel.
Id,
+
504 };
+
505
+
506 var moving = originalModelPath != null;
+
507 if (moving)
+
508 {
+
509 var description = $"Move instance ID {originalModel.Id} from {originalModelPath} to {normalizedPath}";
+
+
511 job.Description = description;
+
512
+
+
514 job,
+
515 (core, databaseContextFactory, paramJob, progressHandler, ct)
+
+
517 cancellationToken);
+
518 api.MoveJob = job.ToApi();
+
519 }
+
520
+
521 if (changedAutoInterval || changedAutoCron)
+
522 {
+
523
+
+
525 async componentInstance =>
+
526 {
+
+
528 return null;
+
529 },
+
530 originalModel);
+
531 }
+
532
+
+
534 return moving ? Accepted(api) : Json(api);
+
535 }
bool? Online
If the Instance is online.
string? AutoUpdateCron
A cron expression indicating when auto-updates should trigger. Must be a valid 6 part cron schedule (...
@@ -1677,7 +1706,7 @@ Here is the caller graph for this function:
ValueTask RegisterOperation(Job job, JobEntrypoint operation, CancellationToken cancellationToken)
Registers a given Job and begins running it.
RightsType
The type of rights a model uses.
-
References Tgstation.Server.Host.Jobs.IJobManager.CancelJob(), Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Models.Job.Create(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Controllers.ComponentInterfacingController.InstanceOperations, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.InstanceController.jobManager, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Host.Components.IInstanceOperations.MoveInstance(), Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), Tgstation.Server.Host.Components.IInstanceOperations.OfflineInstance(), Tgstation.Server.Host.Components.IInstanceOperations.OnlineInstance(), Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Jobs.IJobManager.RegisterOperation(), Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, Tgstation.Server.Host.Security.AuthenticationContext.User, Tgstation.Server.Host.Controllers.InstanceController.ValidateCronSetting(), Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
+
References Tgstation.Server.Host.Jobs.IJobManager.CancelJob(), Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Models.Job.Create(), Tgstation.Server.Host.IO.IIOManager.DirectoryExists(), Tgstation.Server.Host.IO.IIOManager.FileExists(), Tgstation.Server.Host.Security.AuthenticationContext.GetRight(), Tgstation.Server.Api.Models.EntityId.Id, Tgstation.Server.Api.Models.Internal.SwarmServer.Identifier, Tgstation.Server.Api.Models.PermissionSet.InstanceManagerRights, Tgstation.Server.Host.Controllers.ComponentInterfacingController.InstanceOperations, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Controllers.InstanceController.ioManager, Tgstation.Server.Host.Controllers.InstanceController.jobManager, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Host.Components.IInstanceOperations.MoveInstance(), Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), Tgstation.Server.Host.Components.IInstanceOperations.OfflineInstance(), Tgstation.Server.Host.Components.IInstanceOperations.OnlineInstance(), Tgstation.Server.Host.Security.AuthenticationContext.PermissionSet, Tgstation.Server.Host.Jobs.IJobManager.RegisterOperation(), Tgstation.Server.Host.Database.DatabaseContext.Save(), Tgstation.Server.Host.Controllers.InstanceController.swarmConfiguration, Tgstation.Server.Host.Security.AuthenticationContext.User, Tgstation.Server.Host.Controllers.InstanceController.ValidateCronSetting(), Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateInstanceOnlineStatus(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.WithComponentInstanceNullable().
@@ -1742,28 +1771,28 @@ Here is the call graph for this function:
- Returns
null if instance has a valid Api.Models.Instance.AutoUpdateCron setting, a BadRequestObjectResult otherwise.
-
Definition at line 826 of file InstanceController.cs.
-
827 {
-
828 if (!String.IsNullOrWhiteSpace(instance.AutoUpdateCron))
-
829 {
-
830 if ((instance.AutoUpdateInterval.HasValue && instance.AutoUpdateInterval.Value != 0)
-
831 || (CrontabSchedule.TryParse(
-
832 instance.AutoUpdateCron,
-
833 new CrontabSchedule.ParseOptions
-
834 {
-
835 IncludingSeconds = true,
-
836 }) == null))
-
-
838
-
839 instance.AutoUpdateInterval = 0;
-
840 }
-
841 else
-
842 instance.AutoUpdateCron = String.Empty;
-
843
-
844 return null;
-
845 }
+
Definition at line 852 of file InstanceController.cs.
+
853 {
+
854 if (!String.IsNullOrWhiteSpace(instance.AutoUpdateCron))
+
855 {
+
856 if ((instance.AutoUpdateInterval.HasValue && instance.AutoUpdateInterval.Value != 0)
+
857 || (CrontabSchedule.TryParse(
+
858 instance.AutoUpdateCron,
+
859 new CrontabSchedule.ParseOptions
+
860 {
+
861 IncludingSeconds = true,
+
862 }) == null))
+
+
864
+
865 instance.AutoUpdateInterval = 0;
+
866 }
+
867 else
+
868 instance.AutoUpdateCron = String.Empty;
+
869
+
870 return null;
+
871 }
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -1802,7 +1831,7 @@ Here is the caller graph for this function:
Definition at line 77 of file InstanceController.cs.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.InstanceController().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.InstanceController().
@@ -1858,7 +1887,7 @@ Here is the caller graph for this function:
Definition at line 57 of file InstanceController.cs.
-
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+
Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), Tgstation.Server.Host.Controllers.InstanceController.NormalizePath(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -1886,7 +1915,7 @@ Here is the caller graph for this function:
Definition at line 52 of file InstanceController.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -1942,7 +1971,7 @@ Here is the caller graph for this function:
Definition at line 62 of file InstanceController.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), and Tgstation.Server.Host.Controllers.InstanceController.NormalizePath().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), and Tgstation.Server.Host.Controllers.InstanceController.NormalizePath().
@@ -1970,7 +1999,7 @@ Here is the caller graph for this function:
Definition at line 67 of file InstanceController.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.InstanceController().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), and Tgstation.Server.Host.Controllers.InstanceController.InstanceController().
@@ -1998,7 +2027,7 @@ Here is the caller graph for this function:
Definition at line 82 of file InstanceController.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstanceController.CreateDefaultInstance(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.InstanceController(), Tgstation.Server.Host.Controllers.InstanceController.List(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_permission_set_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_permission_set_controller.html
index d7584f2a01..9111ed6196 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_permission_set_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_permission_set_controller.html
@@ -268,7 +268,7 @@ Additional Inherited Members
◆ InstancePermissionSetController()
@@ -333,20 +333,20 @@ Additional Inherited Members
-Definition at line 47 of file InstancePermissionSetController.cs.
-
@@ -388,59 +388,59 @@ Additional Inherited Members
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="201">InstancePermissionSet created successfully.</response> <response code="410">The Api.Models.PermissionSet does not exist.</response>
-Definition at line 77 of file InstancePermissionSetController.cs.
- 78 {
-
79 ArgumentNullException.ThrowIfNull(model);
-
80
-
-
-
83 .AsQueryable()
-
-
85 .Select(x => new Models.PermissionSet
-
86 {
-
87 Id = x.Id,
-
88 UserId = x.UserId,
-
89 })
-
90 .FirstOrDefaultAsync(cancellationToken);
-
91
-
92 if (existingPermissionSet == default)
-
93 return this.Gone();
-
94
-
95 if (existingPermissionSet.UserId.HasValue)
-
96 {
-
-
-
99 .AsQueryable()
-
100 .Where(x => x.Id == existingPermissionSet.UserId.Value)
-
101 .Select(x => x.CanonicalName)
-
102 .FirstAsync(cancellationToken);
-
103
-
104 if (userCanonicalName == Models.User.CanonicalizeName(Models.User.TgsSystemUserName))
-
105 return Forbid();
-
106 }
-
107
-
-
109 {
-
-
-
-
-
-
-
-
-
118 InstanceId =
Instance.Require(x => x.Id),
-
119 };
+
Definition at line 75 of file InstancePermissionSetController.cs.
+
76 {
+
77 ArgumentNullException.ThrowIfNull(model);
+
78
+
+
+
81 .AsQueryable()
+
+
83 .Select(x => new Models.PermissionSet
+
84 {
+
85 Id = x.Id,
+
86 UserId = x.UserId,
+
87 })
+
88 .FirstOrDefaultAsync(cancellationToken);
+
89
+
90 if (existingPermissionSet == default)
+
91 return this.Gone();
+
92
+
93 if (existingPermissionSet.UserId.HasValue)
+
94 {
+
+
+
97 .AsQueryable()
+
98 .Where(x => x.Id == existingPermissionSet.UserId.Value)
+
99 .Select(x => x.CanonicalName)
+
100 .FirstAsync(cancellationToken);
+
101
+
102 if (userCanonicalName == Models.User.CanonicalizeName(Models.User.TgsSystemUserName))
+
103 return Forbid();
+
104 }
+
105
+
+
107 {
+
+
+
+
+
+
+
+
+
116 InstanceId =
Instance.Require(x => x.Id),
+
117 };
+
118
+
120
-
+
122
-
-
124
-
125
-
126 dbUser.PermissionSet = existingPermissionSet;
-
-
128 return Created(dbUser.ToApi());
-
129 }
+
123
+
124 dbUser.PermissionSet = existingPermissionSet;
+
+
126 return Created(dbUser.ToApi());
+
127 }
Metadata about a server instance.
ChatBotRights? ChatBotRights
The Rights.ChatBotRights of the InstancePermissionSet.
ConfigurationRights? ConfigurationRights
The Rights.ConfigurationRights of the InstancePermissionSet.
@@ -467,7 +467,7 @@ Additional Inherited Members
InstancePermissionSetRights
Rights for an Models.Instance.
DreamDaemonRights
Rights for managing DreamDaemon.
-
References Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Security.IPermissionsUpdateNotifyee.InstancePermissionSetCreated(), Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.PermissionSets, Tgstation.Server.Host.Controllers.InstancePermissionSetController.permissionsUpdateNotifyee, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Host.Database.DatabaseContext.Users.
+
References Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Security.IPermissionsUpdateNotifyee.InstancePermissionSetCreated(), Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.PermissionSets, Tgstation.Server.Host.Controllers.InstancePermissionSetController.permissionsUpdateNotifyee, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Host.Database.DatabaseContext.Users.
@@ -519,18 +519,18 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="204">Target InstancePermissionSet deleted.</response> <response code="410">Target InstancePermissionSet or no longer exists.</response>
-
Definition at line 254 of file InstancePermissionSetController.cs.
-
255 {
-
-
-
258 .AsQueryable()
-
-
260 .SelectMany(x => x.InstancePermissionSets)
-
261 .Where(x => x.PermissionSetId == id)
-
262 .DeleteAsync(cancellationToken);
-
263
-
264 return numDeleted > 0 ? NoContent() : this.Gone();
-
265 }
+
Definition at line 252 of file InstancePermissionSetController.cs.
+
253 {
+
+
+
256 .AsQueryable()
+
+
258 .SelectMany(x => x.InstancePermissionSets)
+
259 .Where(x => x.PermissionSetId == id)
+
260 .ExecuteDeleteAsync(cancellationToken);
+
261
+
262 return numDeleted > 0 ? NoContent() : this.Gone();
+
263 }
virtual ? long Id
The ID of the entity.
DbSet< Instance > Instances
The Instances in the DatabaseContext.
@@ -575,20 +575,20 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">Retrieve Api.Models.Internal.InstancePermissionSet successfully.</response> <response code="410">The requested Api.Models.Internal.InstancePermissionSet does not currently exist.</response>
-
Definition at line 227 of file InstancePermissionSetController.cs.
-
228 {
-
229
-
-
-
232 .AsQueryable()
-
-
234 .SelectMany(x => x.InstancePermissionSets)
-
235 .Where(x => x.PermissionSetId == id)
-
236 .FirstOrDefaultAsync(cancellationToken);
-
237 if (permissionSet == default)
-
238 return this.Gone();
-
239 return Json(permissionSet.ToApi());
-
240 }
+
Definition at line 225 of file InstancePermissionSetController.cs.
+
226 {
+
227
+
+
+
230 .AsQueryable()
+
+
232 .SelectMany(x => x.InstancePermissionSets)
+
233 .Where(x => x.PermissionSetId == id)
+
234 .FirstOrDefaultAsync(cancellationToken);
+
235 if (permissionSet == default)
+
236 return this.Gone();
+
237 return Json(permissionSet.ToApi());
+
238 }
References Tgstation.Server.Api.Models.EntityId.Id, and Tgstation.Server.Host.Database.DatabaseContext.Instances.
@@ -758,39 +758,39 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">InstancePermissionSet updated successfully.</response> <response code="410">The requested InstancePermissionSet does not currently exist.</response>
-
Definition at line 145 of file InstancePermissionSetController.cs.
-
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_group_controller.html b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_group_controller.html
index 60f7474fc4..6208dfc649 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_group_controller.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_group_controller.html
@@ -224,7 +224,7 @@ Additional Inherited Members
ApiController for managing UserGroupResponses.
-
Definition at line 32 of file UserGroupController.cs.
+
Definition at line 30 of file UserGroupController.cs.
◆ UserGroupController()
@@ -282,19 +282,19 @@ Additional Inherited Members
-Definition at line 47 of file UserGroupController.cs.
-
@@ -336,38 +336,38 @@ Additional Inherited Members
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the operation.
<response code="201">UserGroup created successfully.</response>
-Definition at line 73 of file UserGroupController.cs.
- 74 {
-
75 ArgumentNullException.ThrowIfNull(model);
-
76
-
77 if (model.
Name ==
null)
-
-
79
-
-
-
82 .AsQueryable()
-
83 .CountAsync(cancellationToken);
-
-
-
86
-
-
88 {
-
-
-
91 };
-
92
-
-
94 {
-
-
-
97 };
-
98
-
-
-
101 Logger.LogInformation(
"Created new user group {groupName} ({groupId})", dbGroup.Name, dbGroup.Id);
-
102
-
103 return Created(dbGroup.ToApi(
true));
-
104 }
+
Definition at line 71 of file UserGroupController.cs.
+
72 {
+
73 ArgumentNullException.ThrowIfNull(model);
+
74
+
75 if (model.
Name ==
null)
+
+
77
+
+
+
80 .AsQueryable()
+
81 .CountAsync(cancellationToken);
+
+
+
84
+
+
86 {
+
+
+
89 };
+
90
+
+
92 {
+
+
+
95 };
+
96
+
+
+
99 Logger.LogInformation(
"Created new user group {groupName} ({groupId})", dbGroup.Name, dbGroup.Id);
+
100
+
101 return Created(dbGroup.ToApi(
true));
+
102 }
PermissionSet? PermissionSet
The Models.PermissionSet of the UserGroup.
virtual ? string Name
The name of the entity represented by the NamedEntity.
@@ -385,7 +385,7 @@ Additional Inherited Members
InstanceManagerRights
Rights for managing Models.Instances.
AdministrationRights
Administration rights for the server.
-
References Tgstation.Server.Api.Models.PermissionSet.AdministrationRights, Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Controllers.UserGroupController.generalConfiguration, Tgstation.Server.Host.Database.DatabaseContext.Groups, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Api.Models.Internal.ServerInformationBase.UserGroupLimit.
+
References Tgstation.Server.Api.Models.PermissionSet.AdministrationRights, Tgstation.Server.Host.Controllers.ApiController.Created(), Tgstation.Server.Host.Controllers.UserGroupController.generalConfiguration, Tgstation.Server.Host.Database.DatabaseContext.Groups, Tgstation.Server.Host.Controllers.ApiController.Logger, Tgstation.Server.Api.Models.NamedEntity.Name, Tgstation.Server.Host.Database.DatabaseContext.Save(), and Tgstation.Server.Api.Models.Internal.ServerInformationBase.UserGroupLimit.
@@ -436,28 +436,28 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="204">UserGroup was deleted.</response> <response code="409">The UserGroup is not empty.</response> <response code="410">The UserGroup didn't exist.</response>
-
Definition at line 218 of file UserGroupController.cs.
-
219 {
-
-
-
222 .AsQueryable()
-
223 .Where(x => x.Id == id && x.Users!.Count == 0)
-
224 .DeleteAsync(cancellationToken);
-
225
-
226 if (numDeleted > 0)
-
227 return NoContent();
-
228
-
229
-
-
-
232 .AsQueryable()
-
233 .Where(x => x.Id == id)
-
234 .AnyAsync(cancellationToken);
-
235
-
236 return groupExists
-
-
238 : this.Gone();
-
239 }
+
Definition at line 216 of file UserGroupController.cs.
+
217 {
+
+
+
220 .AsQueryable()
+
221 .Where(x => x.Id == id && x.Users!.Count == 0)
+
222 .ExecuteDeleteAsync(cancellationToken);
+
223
+
224 if (numDeleted > 0)
+
225 return NoContent();
+
226
+
227
+
+
+
230 .AsQueryable()
+
231 .Where(x => x.Id == id)
+
232 .AnyAsync(cancellationToken);
+
233
+
234 return groupExists
+
+
236 : this.Gone();
+
237 }
References Tgstation.Server.Host.Database.DatabaseContext.Groups.
@@ -500,20 +500,20 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the request.
<response code="200">Retrieve UserGroup successfully.</response> <response code="410">The requested UserGroup does not currently exist.</response>
-
Definition at line 163 of file UserGroupController.cs.
-
164 {
-
165
-
-
-
168 .AsQueryable()
-
169 .Where(x => x.Id == id)
-
170 .Include(x => x.Users)
-
171 .Include(x => x.PermissionSet)
-
172 .FirstOrDefaultAsync(cancellationToken);
-
173 if (group == default)
-
174 return this.Gone();
-
175 return Json(group.ToApi(true));
-
176 }
+
Definition at line 161 of file UserGroupController.cs.
+
162 {
+
163
+
+
+
166 .AsQueryable()
+
167 .Where(x => x.Id == id)
+
168 .Include(x => x.Users)
+
169 .Include(x => x.PermissionSet)
+
170 .FirstOrDefaultAsync(cancellationToken);
+
171 if (group == default)
+
172 return this.Gone();
+
173 return Json(group.ToApi(true));
+
174 }
References Tgstation.Server.Host.Database.DatabaseContext.Groups.
@@ -602,39 +602,39 @@ Here is the call graph for this function:
- Returns
- A ValueTask<TResult> resulting in the IActionResult of the operation.
<response code="200">UserGroup updated successfully.</response> <response code="410">The requested UserGroup does not currently exist.</response>
-
Definition at line 117 of file UserGroupController.cs.
-
118 {
-
119 ArgumentNullException.ThrowIfNull(model);
-
120
-
-
-
123 .AsQueryable()
-
124 .Where(x => x.Id == model.
Id)
-
125 .Include(x => x.PermissionSet)
-
126 .Include(x => x.Users)
-
127 .FirstOrDefaultAsync(cancellationToken);
-
128
-
129 if (currentGroup == default)
-
130 return this.Gone();
-
131
-
-
133 {
-
134 currentGroup.PermissionSet!.AdministrationRights = model.PermissionSet.AdministrationRights ?? currentGroup.PermissionSet.AdministrationRights;
-
135 currentGroup.PermissionSet.InstanceManagerRights = model.PermissionSet.InstanceManagerRights ?? currentGroup.PermissionSet.InstanceManagerRights;
-
136 }
+
Definition at line 115 of file UserGroupController.cs.
+
116 {
+
117 ArgumentNullException.ThrowIfNull(model);
+
118
+
+
+
121 .AsQueryable()
+
122 .Where(x => x.Id == model.
Id)
+
123 .Include(x => x.PermissionSet)
+
124 .Include(x => x.Users)
+
125 .FirstOrDefaultAsync(cancellationToken);
+
126
+
127 if (currentGroup == default)
+
128 return this.Gone();
+
129
+
+
131 {
+
132 currentGroup.PermissionSet!.AdministrationRights = model.PermissionSet.AdministrationRights ?? currentGroup.PermissionSet.AdministrationRights;
+
133 currentGroup.PermissionSet.InstanceManagerRights = model.PermissionSet.InstanceManagerRights ?? currentGroup.PermissionSet.InstanceManagerRights;
+
134 }
+
135
+
136 currentGroup.Name = model.Name ?? currentGroup.Name;
137
-
138 currentGroup.Name = model.Name ?? currentGroup.Name;
+
139
-
-
141
-
-
-
144 {
-
145 Id = currentGroup.
Id,
-
146 });
-
147
-
148 return Json(currentGroup.ToApi(true));
-
149 }
+
+
+
142 {
+
143 Id = currentGroup.
Id,
+
144 });
+
145
+
146 return Json(currentGroup.ToApi(true));
+
147 }
@@ -736,9 +736,9 @@ Here is the call graph for this function:
The GeneralConfiguration for the UserGroupController.
-
Definition at line 37 of file UserGroupController.cs.
+
Definition at line 35 of file UserGroupController.cs.
-
Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), and Tgstation.Server.Host.Controllers.UserGroupController.UserGroupController().
+
Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), and Tgstation.Server.Host.Controllers.UserGroupController.UserGroupController().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html
index 3abb72e982..8a8d6e1431 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application.html
@@ -1086,7 +1086,7 @@ Here is the caller graph for this function:
void ConfigureAuthenticationPipeline(IServiceCollection services)
Configure the services for the authentication pipeline.
Backend abstract implementation of IDatabaseContext.
-
+
IFilesystemLinkFactory for POSIX systems.
IPostWriteHandler for POSIX systems.
An IIOManager that resolve relative paths from another IIOManager to a subdirectory of that.
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context-members.html b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context-members.html
index d622246768..30b84bb28f 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context-members.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context-members.html
@@ -112,9 +112,9 @@ $(function() {
| Jobs | Tgstation.Server.Host.Database.DatabaseContext | private |
| jobsCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
| Migrate(ILogger< DatabaseContext > logger, CancellationToken cancellationToken) | Tgstation.Server.Host.Database.DatabaseContext | |
+ | OAuthConnections | Tgstation.Server.Host.Database.DatabaseContext | |
+ | OAuthConnections | Tgstation.Server.Host.Database.DatabaseContext | private |
| oAuthConnections | Tgstation.Server.Host.Database.DatabaseContext | private |
- | OAuthConnections | Tgstation.Server.Host.Database.DatabaseContext | |
- | OAuthConnections | Tgstation.Server.Host.Database.DatabaseContext | private |
| OnModelCreating(ModelBuilder modelBuilder) | Tgstation.Server.Host.Database.DatabaseContext | protected |
| PermissionSets | Tgstation.Server.Host.Database.DatabaseContext | |
| PermissionSets | Tgstation.Server.Host.Database.DatabaseContext | private |
@@ -127,12 +127,16 @@ $(function() {
| repositorySettingsCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
| RevInfoCompileJobDeleteBehavior | Tgstation.Server.Host.Database.DatabaseContext | protected |
| RevInfoTestMerges | Tgstation.Server.Host.Database.DatabaseContext | |
+ | RevInfoTestMerges | Tgstation.Server.Host.Database.DatabaseContext | private |
+ | revInfoTestMergesCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
| RevisionInformations | Tgstation.Server.Host.Database.DatabaseContext | |
| RevisionInformations | Tgstation.Server.Host.Database.DatabaseContext | private |
| revisionInformationsCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
| Save(CancellationToken cancellationToken) | Tgstation.Server.Host.Database.DatabaseContext | |
| SchemaDowngradeForServerVersion(ILogger< DatabaseContext > logger, Version targetVersion, DatabaseType currentDatabaseType, CancellationToken cancellationToken) | Tgstation.Server.Host.Database.DatabaseContext | |
| TestMerges | Tgstation.Server.Host.Database.DatabaseContext | |
+ | TestMerges | Tgstation.Server.Host.Database.DatabaseContext | private |
+ | testMergesCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
| Users | Tgstation.Server.Host.Database.DatabaseContext | |
| Users | Tgstation.Server.Host.Database.DatabaseContext | private |
| usersCollection | Tgstation.Server.Host.Database.DatabaseContext | private |
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html
index 4f15f7a1f4..1cdf0ee35d 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html
+++ b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context.html
@@ -107,25 +107,27 @@ Collaboration diagram for Tgstation.Server.Host.Database.DatabaseContext:
[legend]
@@ -273,6 +275,12 @@ Properties
| IDatabaseCollection< RevisionInformation > IDatabaseContext. | RevisionInformations [get] |
| | The RevisionInformations in the IDatabaseContext. More...
|
| |
+| IDatabaseCollection< RevInfoTestMerge > IDatabaseContext. | RevInfoTestMerges [get] |
+| | The RevInfoTestMerges in the IDatabaseContext. More...
|
+| |
+| IDatabaseCollection< TestMerge > IDatabaseContext. | TestMerges [get] |
+| | The TestMerges in the IDatabaseContext. More...
|
+| |
| IDatabaseCollection< DreamMakerSettings > IDatabaseContext. | DreamMakerSettings [get] |
| | The Models.DreamMakerSettings in the IDatabaseContext. More...
|
| |
@@ -322,6 +330,12 @@ Properties
| IDatabaseCollection< RevisionInformation > | RevisionInformations [get] |
| | The RevisionInformations in the IDatabaseContext. More...
|
| |
+| IDatabaseCollection< RevInfoTestMerge > | RevInfoTestMerges [get] |
+| | The RevInfoTestMerges in the IDatabaseContext. More...
|
+| |
+| IDatabaseCollection< TestMerge > | TestMerges [get] |
+| | The TestMerges in the IDatabaseContext. More...
|
+| |
| IDatabaseCollection< DreamMakerSettings > | DreamMakerSettings [get] |
| | The Models.DreamMakerSettings in the IDatabaseContext. More...
|
| |
@@ -370,6 +384,12 @@ Private Attributes
| readonly IDatabaseCollection< RevisionInformation > | revisionInformationsCollection |
| | Backing field for IDatabaseContext.RevisionInformations. More...
|
| |
+| readonly IDatabaseCollection< RevInfoTestMerge > | revInfoTestMergesCollection |
+| | Backing field for IDatabaseContext.RevInfoTestMerges. More...
|
+| |
+| readonly IDatabaseCollection< TestMerge > | testMergesCollection |
+| | Backing field for IDatabaseContext.TestMerges. More...
|
+| |
| readonly IDatabaseCollection< DreamMakerSettings > | dreamMakerSettingsCollection |
| | Backing field for IDatabaseContext.DreamMakerSettings. More...
|
| |
@@ -435,57 +455,63 @@ Private Attributes
-Definition at line 257 of file DatabaseContext.cs.
- 258 : base(dbContextOptions)
-
259 {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
275 }
+
Definition at line 273 of file DatabaseContext.cs.
+
274 : base(dbContextOptions)
+
275 {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
293 }
DbSet< ReattachInformation > ReattachInformations
The ReattachInformations in the DatabaseContext.
-
readonly IDatabaseCollection< UserGroup > groups
Backing field for IDatabaseContext.Groups.
+
readonly IDatabaseCollection< UserGroup > groups
Backing field for IDatabaseContext.Groups.
DbSet< Job > Jobs
The Jobs in the DatabaseContext.
DbSet< Instance > Instances
The Instances in the DatabaseContext.
-
readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
-
readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
+
readonly IDatabaseCollection< RevInfoTestMerge > revInfoTestMergesCollection
Backing field for IDatabaseContext.RevInfoTestMerges.
+
readonly IDatabaseCollection< DreamMakerSettings > dreamMakerSettingsCollection
Backing field for IDatabaseContext.DreamMakerSettings.
+
readonly IDatabaseCollection< RepositorySettings > repositorySettingsCollection
Backing field for IDatabaseContext.RepositorySettings.
DbSet< OAuthConnection > OAuthConnections
The OAuthConnections in the DatabaseContext.
-
readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
-
readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
+
readonly IDatabaseCollection< User > usersCollection
Backing field for IDatabaseContext.Users.
+
readonly IDatabaseCollection< Job > jobsCollection
Backing field for IDatabaseContext.Jobs.
DbSet< ChatChannel > ChatChannels
The ChatChannels in the DatabaseContext.
-
readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
-
readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
+
readonly IDatabaseCollection< DreamDaemonSettings > dreamDaemonSettingsCollection
Backing field for IDatabaseContext.DreamDaemonSettings.
+
readonly IDatabaseCollection< Instance > instancesCollection
Backing field for IDatabaseContext.Instances.
DbSet< InstancePermissionSet > InstancePermissionSets
The InstancePermissionSets in the DatabaseContext.
DbSet< PermissionSet > PermissionSets
The PermissionSets in the DatabaseContext.
-
readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
+
readonly IDatabaseCollection< ChatChannel > chatChannelsCollection
Backing field for IDatabaseContext.ChatChannels.
DbSet< CompileJob > CompileJobs
The CompileJobs in the DatabaseContext.
-
readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
-
readonly IDatabaseCollection< InstancePermissionSet > instancePermissionSetsCollection
Backing field for IDatabaseContext.InstancePermissionSets.
-
readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
-
readonly IDatabaseCollection< PermissionSet > permissionSets
Backing field for IDatabaseContext.PermissionSets.
-
readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
-
readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
+
readonly IDatabaseCollection< RevisionInformation > revisionInformationsCollection
Backing field for IDatabaseContext.RevisionInformations.
+
DbSet< TestMerge > TestMerges
The TestMerges in the DatabaseContext.
+
readonly IDatabaseCollection< InstancePermissionSet > instancePermissionSetsCollection
Backing field for IDatabaseContext.InstancePermissionSets.
+
readonly IDatabaseCollection< ReattachInformation > reattachInformationsCollection
Backing field for IDatabaseContext.ReattachInformations.
+
readonly IDatabaseCollection< PermissionSet > permissionSets
Backing field for IDatabaseContext.PermissionSets.
+
readonly IDatabaseCollection< ChatBot > chatBotsCollection
Backing field for IDatabaseContext.ChatBots.
+
readonly IDatabaseCollection< CompileJob > compileJobsCollection
Backing field for IDatabaseContext.CompileJobs.
DbSet< User > Users
The Users in the DatabaseContext.
DbSet< ChatBot > ChatBots
The ChatBots in the DatabaseContext.
-
readonly IDatabaseCollection< OAuthConnection > oAuthConnections
Backing field for IDatabaseContext.OAuthConnections.
+
DbSet< RevInfoTestMerge > RevInfoTestMerges
The RevInfoTestMerges in the DatabaseContext.
+
readonly IDatabaseCollection< OAuthConnection > oAuthConnections
Backing field for IDatabaseContext.OAuthConnections.
+
readonly IDatabaseCollection< TestMerge > testMergesCollection
Backing field for IDatabaseContext.TestMerges.
DbSet< RevisionInformation > RevisionInformations
The RevisionInformations in the DatabaseContext.
DbSet< UserGroup > Groups
The UserGroups in the DatabaseContext.
-
References Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Database.DatabaseContext.chatBotsCollection, Tgstation.Server.Host.Database.DatabaseContext.ChatChannels, Tgstation.Server.Host.Database.DatabaseContext.chatChannelsCollection, Tgstation.Server.Host.Database.DatabaseContext.CompileJobs, Tgstation.Server.Host.Database.DatabaseContext.compileJobsCollection, Tgstation.Server.Host.Database.DatabaseContext.dreamDaemonSettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.dreamMakerSettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.Groups, Tgstation.Server.Host.Database.DatabaseContext.groups, Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.instancePermissionSetsCollection, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Database.DatabaseContext.instancesCollection, Tgstation.Server.Host.Database.DatabaseContext.Jobs, Tgstation.Server.Host.Database.DatabaseContext.jobsCollection, Tgstation.Server.Host.Database.DatabaseContext.OAuthConnections, Tgstation.Server.Host.Database.DatabaseContext.oAuthConnections, Tgstation.Server.Host.Database.DatabaseContext.PermissionSets, Tgstation.Server.Host.Database.DatabaseContext.permissionSets, Tgstation.Server.Host.Database.DatabaseContext.ReattachInformations, Tgstation.Server.Host.Database.DatabaseContext.reattachInformationsCollection, Tgstation.Server.Host.Database.DatabaseContext.repositorySettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.RevisionInformations, Tgstation.Server.Host.Database.DatabaseContext.revisionInformationsCollection, Tgstation.Server.Host.Database.DatabaseContext.Users, and Tgstation.Server.Host.Database.DatabaseContext.usersCollection.
+
References Tgstation.Server.Host.Database.DatabaseContext.ChatBots, Tgstation.Server.Host.Database.DatabaseContext.chatBotsCollection, Tgstation.Server.Host.Database.DatabaseContext.ChatChannels, Tgstation.Server.Host.Database.DatabaseContext.chatChannelsCollection, Tgstation.Server.Host.Database.DatabaseContext.CompileJobs, Tgstation.Server.Host.Database.DatabaseContext.compileJobsCollection, Tgstation.Server.Host.Database.DatabaseContext.dreamDaemonSettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.dreamMakerSettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.Groups, Tgstation.Server.Host.Database.DatabaseContext.groups, Tgstation.Server.Host.Database.DatabaseContext.InstancePermissionSets, Tgstation.Server.Host.Database.DatabaseContext.instancePermissionSetsCollection, Tgstation.Server.Host.Database.DatabaseContext.Instances, Tgstation.Server.Host.Database.DatabaseContext.instancesCollection, Tgstation.Server.Host.Database.DatabaseContext.Jobs, Tgstation.Server.Host.Database.DatabaseContext.jobsCollection, Tgstation.Server.Host.Database.DatabaseContext.OAuthConnections, Tgstation.Server.Host.Database.DatabaseContext.oAuthConnections, Tgstation.Server.Host.Database.DatabaseContext.PermissionSets, Tgstation.Server.Host.Database.DatabaseContext.permissionSets, Tgstation.Server.Host.Database.DatabaseContext.ReattachInformations, Tgstation.Server.Host.Database.DatabaseContext.reattachInformationsCollection, Tgstation.Server.Host.Database.DatabaseContext.repositorySettingsCollection, Tgstation.Server.Host.Database.DatabaseContext.RevInfoTestMerges, Tgstation.Server.Host.Database.DatabaseContext.revInfoTestMergesCollection, Tgstation.Server.Host.Database.DatabaseContext.RevisionInformations, Tgstation.Server.Host.Database.DatabaseContext.revisionInformationsCollection, Tgstation.Server.Host.Database.DatabaseContext.TestMerges, Tgstation.Server.Host.Database.DatabaseContext.testMergesCollection, Tgstation.Server.Host.Database.DatabaseContext.Users, and Tgstation.Server.Host.Database.DatabaseContext.usersCollection.
@@ -559,18 +585,18 @@ Private Attributes
-Definition at line 241 of file DatabaseContext.cs.
-
-
243 {
-
244
-
245 const string ConfigureMethodName = nameof(SqlServerDatabaseContext.ConfigureWith);
-
246 var configureFunction = typeof(TDatabaseContext).GetMethod(
-
247 ConfigureMethodName,
-
248 BindingFlags.Public | BindingFlags.Static)
-
249 ?? throw new InvalidOperationException($"Context type {typeof(TDatabaseContext).FullName} missing static {ConfigureMethodName} function!");
-
250 return (optionsBuilder, config) => configureFunction.Invoke(null, new object[] { optionsBuilder, config });
-
251 }
-
DatabaseContext(DbContextOptions dbContextOptions)
Initializes a new instance of the DatabaseContext class.
+
Definition at line 257 of file DatabaseContext.cs.
+
+
259 {
+
260
+
261 const string ConfigureMethodName = nameof(SqlServerDatabaseContext.ConfigureWith);
+
262 var configureFunction = typeof(TDatabaseContext).GetMethod(
+
263 ConfigureMethodName,
+
264 BindingFlags.Public | BindingFlags.Static)
+
265 ?? throw new InvalidOperationException($"Context type {typeof(TDatabaseContext).FullName} missing static {ConfigureMethodName} function!");
+
266 return (optionsBuilder, config) => configureFunction.Invoke(null, new object[] { optionsBuilder, config });
+
267 }
+
DatabaseContext(DbContextOptions dbContextOptions)
Initializes a new instance of the DatabaseContext class.
References Tgstation.Server.Host.Database.SqlServerDatabaseContext.ConfigureWith().
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-
Definition at line 284 of file DatabaseContext.cs.
-
285 {
-
286 ArgumentNullException.ThrowIfNull(logger);
-
287 var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken);
-
288 var wasEmpty = !migrations.Any();
-
289
-
290 if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken)).Any())
-
291 {
-
292 logger.LogInformation("Migrating database...");
-
293 await Database.MigrateAsync(cancellationToken);
-
294 }
-
295 else
-
296 logger.LogDebug("No migrations to apply");
-
297
-
298 wasEmpty |= !await
Users.AsQueryable().AnyAsync(cancellationToken);
-
299
-
300 return wasEmpty;
-
301 }
+
Definition at line 302 of file DatabaseContext.cs.
+
303 {
+
304 ArgumentNullException.ThrowIfNull(logger);
+
305 var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken);
+
306 var wasEmpty = !migrations.Any();
+
307
+
308 if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken)).Any())
+
309 {
+
310 logger.LogInformation("Migrating database...");
+
311 await Database.MigrateAsync(cancellationToken);
+
312 }
+
313 else
+
314 logger.LogDebug("No migrations to apply");
+
315
+
316 wasEmpty |= !await
Users.AsQueryable().AnyAsync(cancellationToken);
+
317
+
318 return wasEmpty;
+
319 }
References Tgstation.Server.Host.Database.DatabaseContext.Users.
@@ -672,72 +698,72 @@ Here is the call graph for this function:
-
Definition at line 304 of file DatabaseContext.cs.
-
305 {
-
306 ArgumentNullException.ThrowIfNull(modelBuilder);
-
307
-
308 base.OnModelCreating(modelBuilder);
-
309
-
310 var userModel = modelBuilder.Entity<
User>();
-
311 userModel.HasIndex(x => x.CanonicalName).IsUnique();
-
312 userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
-
313 userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
-
314 userModel.HasMany(x => x.OAuthConnections).WithOne(x => x.User).OnDelete(DeleteBehavior.Cascade);
-
315
-
316 modelBuilder.Entity<
OAuthConnection>().HasIndex(x =>
new { x.Provider, x.ExternalUserId }).IsUnique();
-
317
-
318 var groupsModel = modelBuilder.Entity<
UserGroup>();
-
319 groupsModel.HasIndex(x => x.Name).IsUnique();
-
320 groupsModel.HasMany(x => x.Users).WithOne(x => x.Group).OnDelete(DeleteBehavior.ClientSetNull);
-
321
-
322 var permissionSetModel = modelBuilder.Entity<
PermissionSet>();
-
323 permissionSetModel.HasOne(x => x.Group).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
-
324 permissionSetModel.HasOne(x => x.User).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
-
325 permissionSetModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
-
326
-
327 modelBuilder.Entity<
InstancePermissionSet>().HasIndex(x =>
new { x.PermissionSetId, x.InstanceId }).IsUnique();
-
328
-
-
330 revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
-
331 revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
-
332 revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
+
Definition at line 322 of file DatabaseContext.cs.
+
323 {
+
324 ArgumentNullException.ThrowIfNull(modelBuilder);
+
325
+
326 base.OnModelCreating(modelBuilder);
+
327
+
328 var userModel = modelBuilder.Entity<
User>();
+
329 userModel.HasIndex(x => x.CanonicalName).IsUnique();
+
330 userModel.HasIndex(x => x.SystemIdentifier).IsUnique();
+
331 userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
+
332 userModel.HasMany(x => x.OAuthConnections).WithOne(x => x.User).OnDelete(DeleteBehavior.Cascade);
333
-
334
-
335
-
336
-
337
-
338
-
339
-
340
-
-
342
-
343
-
344 modelBuilder.Entity<
TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
-
345
-
346 var compileJob = modelBuilder.Entity<
CompileJob>();
-
347 compileJob.HasIndex(x => x.DirectoryName);
-
348 compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
-
349
-
350 modelBuilder.Entity<
ReattachInformation>().HasOne(x => x.CompileJob).WithMany().OnDelete(DeleteBehavior.Cascade);
+
334 modelBuilder.Entity<
OAuthConnection>().HasIndex(x =>
new { x.Provider, x.ExternalUserId }).IsUnique();
+
335
+
336 var groupsModel = modelBuilder.Entity<
UserGroup>();
+
337 groupsModel.HasIndex(x => x.Name).IsUnique();
+
338 groupsModel.HasMany(x => x.Users).WithOne(x => x.Group).OnDelete(DeleteBehavior.ClientSetNull);
+
339
+
340 var permissionSetModel = modelBuilder.Entity<
PermissionSet>();
+
341 permissionSetModel.HasOne(x => x.Group).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+
342 permissionSetModel.HasOne(x => x.User).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+
343 permissionSetModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.PermissionSet).OnDelete(DeleteBehavior.Cascade);
+
344
+
345 modelBuilder.Entity<
InstancePermissionSet>().HasIndex(x =>
new { x.PermissionSetId, x.InstanceId }).IsUnique();
+
346
+
+
348 revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
+
349 revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Cascade);
+
350 revInfo.HasIndex(x => new { x.InstanceId, x.CommitSha }).IsUnique();
351
-
352 var chatChannel = modelBuilder.Entity<
ChatChannel>();
-
353 chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
-
354 chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
-
355 chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
-
356
-
357 modelBuilder.Entity<
ChatBot>().HasIndex(x =>
new { x.InstanceId, x.Name }).IsUnique();
-
358
-
359 var instanceModel = modelBuilder.Entity<
Instance>();
-
360 instanceModel.HasIndex(x => new { x.Path, x.SwarmIdentifer }).IsUnique();
-
361 instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
362 instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
363 instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
364 instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
365 instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
366 instanceModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
367 instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
-
368 }
-
virtual DeleteBehavior RevInfoCompileJobDeleteBehavior
The DeleteBehavior for the CompileJob/RevisionInformation foreign key.
+
352
+
353
+
354
+
355
+
356
+
357
+
358
+
+
360
+
361
+
362 modelBuilder.Entity<
TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.ClientNoAction);
+
363
+
364 var compileJob = modelBuilder.Entity<
CompileJob>();
+
365 compileJob.HasIndex(x => x.DirectoryName);
+
366 compileJob.HasOne(x => x.Job).WithOne().OnDelete(DeleteBehavior.Cascade);
+
367
+
368 modelBuilder.Entity<
ReattachInformation>().HasOne(x => x.CompileJob).WithMany().OnDelete(DeleteBehavior.Cascade);
+
369
+
370 var chatChannel = modelBuilder.Entity<
ChatChannel>();
+
371 chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
+
372 chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
+
373 chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
+
374
+
375 modelBuilder.Entity<
ChatBot>().HasIndex(x =>
new { x.InstanceId, x.Name }).IsUnique();
+
376
+
377 var instanceModel = modelBuilder.Entity<
Instance>();
+
378 instanceModel.HasIndex(x => new { x.Path, x.SwarmIdentifer }).IsUnique();
+
379 instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
380 instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
381 instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
382 instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
383 instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
384 instanceModel.HasMany(x => x.InstancePermissionSets).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
385 instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
+
386 }
+
virtual DeleteBehavior RevInfoCompileJobDeleteBehavior
The DeleteBehavior for the CompileJob/RevisionInformation foreign key.
@@ -751,7 +777,7 @@ Here is the call graph for this function:
Represents a group of Users.
-
References Tgstation.Server.Host.Database.DatabaseContext.RevInfoCompileJobDeleteBehavior.
+
References Tgstation.Server.Host.Database.DatabaseContext.RevInfoCompileJobDeleteBehavior.
@@ -782,7 +808,7 @@ Here is the call graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.RepositoryController.Update(), Tgstation.Server.Host.Controllers.UserGroupController.Update(), Tgstation.Server.Host.Controllers.UserController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateRequest().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.RepositoryController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Controllers.RepositoryController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.RepositoryController.Read(), Tgstation.Server.Host.Controllers.ChatController.Update(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.DreamMakerController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), Tgstation.Server.Host.Controllers.InstanceController.Update(), Tgstation.Server.Host.Controllers.RepositoryController.Update(), Tgstation.Server.Host.Controllers.UserGroupController.Update(), Tgstation.Server.Host.Controllers.UserController.Update(), and Tgstation.Server.Host.Controllers.ComponentInterfacingController.ValidateRequest().
@@ -869,229 +895,229 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 397 of file DatabaseContext.cs.
- 402 {
-
403 ArgumentNullException.ThrowIfNull(logger);
-
404 ArgumentNullException.ThrowIfNull(targetVersion);
-
405 if (targetVersion < new Version(4, 0))
-
406 throw new ArgumentOutOfRangeException(nameof(targetVersion), targetVersion, "Cannot migrate below version 4.0.0!");
-
407
-
408 if (currentDatabaseType ==
DatabaseType.PostgresSql && targetVersion <
new Version(4, 3, 0))
-
409 throw new NotSupportedException("Cannot migrate below version 4.3.0 with PostgresSql!");
-
410
-
-
-
413
-
414 if (targetVersion < new Version(4, 1, 0))
-
415 throw new NotSupportedException("Cannot migrate below version 4.1.0!");
-
416
-
417
-
418 string? targetMigration = null;
-
419
-
420 string BadDatabaseType() => throw new ArgumentException($"Invalid DatabaseType: {currentDatabaseType}", nameof(currentDatabaseType));
-
421
-
422 if (targetVersion < new Version(6, 7, 0))
-
423 targetMigration = currentDatabaseType switch
-
424 {
-
-
-
-
-
429 _ => BadDatabaseType(),
-
430 };
+
Definition at line 415 of file DatabaseContext.cs.
+
420 {
+
421 ArgumentNullException.ThrowIfNull(logger);
+
422 ArgumentNullException.ThrowIfNull(targetVersion);
+
423 if (targetVersion < new Version(4, 0))
+
424 throw new ArgumentOutOfRangeException(nameof(targetVersion), targetVersion, "Cannot migrate below version 4.0.0!");
+
425
+
426 if (currentDatabaseType ==
DatabaseType.PostgresSql && targetVersion <
new Version(4, 3, 0))
+
427 throw new NotSupportedException("Cannot migrate below version 4.3.0 with PostgresSql!");
+
428
+
+
431
-
432 if (targetVersion < new Version(6, 6, 0))
-
433 targetMigration = currentDatabaseType switch
-
434 {
-
-
-
-
-
439 _ => BadDatabaseType(),
-
440 };
-
441
-
442 if (targetVersion < new Version(6, 5, 0))
-
443 targetMigration = currentDatabaseType switch
-
444 {
-
-
-
-
-
449 _ => BadDatabaseType(),
-
450 };
-
451
-
452 if (targetVersion < new Version(6, 2, 0))
-
453 targetMigration = currentDatabaseType switch
-
454 {
-
-
-
-
-
459 _ => BadDatabaseType(),
-
460 };
-
461
-
462 if (targetVersion < new Version(6, 0, 0))
-
463 targetMigration = currentDatabaseType switch
-
464 {
-
-
-
-
-
469 _ => BadDatabaseType(),
-
470 };
-
471 if (targetVersion < new Version(5, 17, 0))
-
472 targetMigration = currentDatabaseType switch
-
473 {
-
-
-
-
-
478 _ => BadDatabaseType(),
-
479 };
-
480 if (targetVersion < new Version(5, 13, 0))
+
432 if (targetVersion < new Version(4, 1, 0))
+
433 throw new NotSupportedException("Cannot migrate below version 4.1.0!");
+
434
+
435
+
436 string? targetMigration = null;
+
437
+
438 string BadDatabaseType() => throw new ArgumentException($"Invalid DatabaseType: {currentDatabaseType}", nameof(currentDatabaseType));
+
439
+
440 if (targetVersion < new Version(6, 7, 0))
+
441 targetMigration = currentDatabaseType switch
+
442 {
+
+
+
+
+
447 _ => BadDatabaseType(),
+
448 };
+
449
+
450 if (targetVersion < new Version(6, 6, 0))
+
451 targetMigration = currentDatabaseType switch
+
452 {
+
+
+
+
+
457 _ => BadDatabaseType(),
+
458 };
+
459
+
460 if (targetVersion < new Version(6, 5, 0))
+
461 targetMigration = currentDatabaseType switch
+
462 {
+
+
+
+
+
467 _ => BadDatabaseType(),
+
468 };
+
469
+
470 if (targetVersion < new Version(6, 2, 0))
+
471 targetMigration = currentDatabaseType switch
+
472 {
+
+
+
+
+
477 _ => BadDatabaseType(),
+
478 };
+
479
+
480 if (targetVersion < new Version(6, 0, 0))
481 targetMigration = currentDatabaseType switch
482 {
-
-
-
-
+
+
+
+
487 _ => BadDatabaseType(),
488 };
-
489 if (targetVersion < new Version(5, 7, 3))
+
489 if (targetVersion < new Version(5, 17, 0))
490 targetMigration = currentDatabaseType switch
491 {
-
-
-
-
+
+
+
+
496 _ => BadDatabaseType(),
497 };
-
498 if (targetVersion < new Version(5, 7, 0))
+
498 if (targetVersion < new Version(5, 13, 0))
499 targetMigration = currentDatabaseType switch
500 {
-
-
-
-
+
+
+
+
505 _ => BadDatabaseType(),
506 };
-
507 if (targetVersion < new Version(4, 19, 0))
+
507 if (targetVersion < new Version(5, 7, 3))
508 targetMigration = currentDatabaseType switch
509 {
-
-
-
-
+
+
+
+
514 _ => BadDatabaseType(),
515 };
-
516 if (targetVersion < new Version(4, 18, 0))
+
516 if (targetVersion < new Version(5, 7, 0))
517 targetMigration = currentDatabaseType switch
518 {
-
-
-
-
+
+
+
+
523 _ => BadDatabaseType(),
524 };
-
525 if (targetVersion < new Version(4, 14, 0))
+
525 if (targetVersion < new Version(4, 19, 0))
526 targetMigration = currentDatabaseType switch
527 {
-
-
-
-
+
+
+
+
532 _ => BadDatabaseType(),
533 };
-
534 if (targetVersion < new Version(4, 10, 0))
+
534 if (targetVersion < new Version(4, 18, 0))
535 targetMigration = currentDatabaseType switch
536 {
-
-
-
-
+
+
+
+
541 _ => BadDatabaseType(),
542 };
-
543 if (targetVersion < new Version(4, 8, 0))
+
543 if (targetVersion < new Version(4, 14, 0))
544 targetMigration = currentDatabaseType switch
545 {
-
-
-
-
+
+
+
+
550 _ => BadDatabaseType(),
551 };
-
552 if (targetVersion < new Version(4, 7, 0))
+
552 if (targetVersion < new Version(4, 10, 0))
553 targetMigration = currentDatabaseType switch
554 {
-
-
-
-
+
+
+
+
559 _ => BadDatabaseType(),
560 };
-
561 if (targetVersion < new Version(4, 6, 0))
+
561 if (targetVersion < new Version(4, 8, 0))
562 targetMigration = currentDatabaseType switch
563 {
-
-
-
-
+
+
+
+
568 _ => BadDatabaseType(),
569 };
-
570 if (targetVersion < new Version(4, 5, 0))
+
570 if (targetVersion < new Version(4, 7, 0))
571 targetMigration = currentDatabaseType switch
572 {
-
-
-
-
+
+
+
+
577 _ => BadDatabaseType(),
578 };
-
579 if (targetVersion < new Version(4, 4, 0))
+
579 if (targetVersion < new Version(4, 6, 0))
580 targetMigration = currentDatabaseType switch
581 {
-
-
583 DatabaseType.PostgresSql => nameof(
PGCreate),
-
-
+
+
+
+
586 _ => BadDatabaseType(),
587 };
-
588 if (targetVersion < new Version(4, 2, 0))
-
-
590
-
591 if (targetMigration == null)
-
592 {
-
593 logger.LogDebug("No down migration required.");
-
594 return;
-
595 }
-
596
-
597
-
598 var migrationSubstitution = currentDatabaseType switch
-
599 {
-
600 DatabaseType.SqlServer => null,
-
601 DatabaseType.MySql => "MY{0}",
-
602 DatabaseType.Sqlite => "SL{0}",
-
603 DatabaseType.PostgresSql => "PG{0}",
-
604 _ => throw new InvalidOperationException($"Invalid DatabaseType: {currentDatabaseType}"),
-
605 };
-
606
-
607 if (migrationSubstitution != null)
-
608 targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration[2..]);
-
609
-
610
-
611 var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
-
612 var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
-
613
-
614 logger.LogInformation("Migrating down to version {targetVersion}. Target: {targetMigration}", targetVersion, targetMigration);
-
615 try
-
616 {
-
617 await migrator.MigrateAsync(targetMigration, cancellationToken);
-
618 }
-
-
620 {
-
621 logger.LogCritical(e, "Failed to migrate!");
-
622 }
-
623 }
+
588 if (targetVersion < new Version(4, 5, 0))
+
589 targetMigration = currentDatabaseType switch
+
590 {
+
+
+
+
+
595 _ => BadDatabaseType(),
+
596 };
+
597 if (targetVersion < new Version(4, 4, 0))
+
598 targetMigration = currentDatabaseType switch
+
599 {
+
+
601 DatabaseType.PostgresSql => nameof(
PGCreate),
+
+
+
604 _ => BadDatabaseType(),
+
605 };
+
606 if (targetVersion < new Version(4, 2, 0))
+
+
608
+
609 if (targetMigration == null)
+
610 {
+
611 logger.LogDebug("No down migration required.");
+
612 return;
+
613 }
+
614
+
615
+
616 var migrationSubstitution = currentDatabaseType switch
+
617 {
+
618 DatabaseType.SqlServer => null,
+
619 DatabaseType.MySql => "MY{0}",
+
620 DatabaseType.Sqlite => "SL{0}",
+
621 DatabaseType.PostgresSql => "PG{0}",
+
622 _ => throw new InvalidOperationException($"Invalid DatabaseType: {currentDatabaseType}"),
+
623 };
+
624
+
625 if (migrationSubstitution != null)
+
626 targetMigration = String.Format(CultureInfo.InvariantCulture, migrationSubstitution, targetMigration[2..]);
+
627
+
628
+
629 var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
+
630 var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
+
631
+
632 logger.LogInformation("Migrating down to version {targetVersion}. Target: {targetMigration}", targetVersion, targetMigration);
+
633 try
+
634 {
+
635 await migrator.MigrateAsync(targetMigration, cancellationToken);
+
636 }
+
+
638 {
+
639 logger.LogCritical(e, "Failed to migrate!");
+
640 }
+
641 }
Adds the AdditionalParameters DD column for MSSQL.
@@ -1191,9 +1217,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.ChatBots.
-
Definition at line 204 of file DatabaseContext.cs.
+
Definition at line 220 of file DatabaseContext.cs.
-
Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+
Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1219,9 +1245,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.ChatChannels.
-Definition at line 209 of file DatabaseContext.cs.
+Definition at line 225 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1247,9 +1273,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.CompileJobs.
-Definition at line 174 of file DatabaseContext.cs.
+Definition at line 180 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1275,9 +1301,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.DreamDaemonSettings.
-Definition at line 199 of file DatabaseContext.cs.
+Definition at line 215 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1303,9 +1329,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.DreamMakerSettings.
-Definition at line 194 of file DatabaseContext.cs.
+Definition at line 210 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1331,9 +1357,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.Groups.
-Definition at line 229 of file DatabaseContext.cs.
+Definition at line 245 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1359,9 +1385,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.InstancePermissionSets.
-Definition at line 179 of file DatabaseContext.cs.
+Definition at line 185 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1387,9 +1413,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.Instances.
-Definition at line 169 of file DatabaseContext.cs.
+Definition at line 175 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1415,9 +1441,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.Jobs.
-Definition at line 184 of file DatabaseContext.cs.
+Definition at line 190 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1443,9 +1469,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.OAuthConnections.
-Definition at line 224 of file DatabaseContext.cs.
+Definition at line 240 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1471,9 +1497,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.PermissionSets.
-Definition at line 234 of file DatabaseContext.cs.
+Definition at line 250 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1499,9 +1525,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.ReattachInformations.
-Definition at line 219 of file DatabaseContext.cs.
+Definition at line 235 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1527,9 +1553,37 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.RepositorySettings.
-Definition at line 214 of file DatabaseContext.cs.
+Definition at line 230 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+
+
+
+
+◆ revInfoTestMergesCollection
+
+
@@ -1555,9 +1609,37 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.RevisionInformations.
-Definition at line 189 of file DatabaseContext.cs.
+Definition at line 195 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+
+
+
+
+◆ testMergesCollection
+
+
@@ -1583,9 +1665,9 @@ Here is the caller graph for this function:
Backing field for IDatabaseContext.Users.
-Definition at line 164 of file DatabaseContext.cs.
+Definition at line 170 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -1617,7 +1699,7 @@ Here is the caller graph for this function:
Definition at line 54 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.ChatController.Delete(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Controllers.ChatController.Update(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+Referenced by Tgstation.Server.Host.Controllers.ChatController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.ChatController.Delete(), Tgstation.Server.Host.Controllers.ChatController.List(), Tgstation.Server.Host.Controllers.ChatController.Update(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -1645,7 +1727,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 136 of file DatabaseContext.cs.
+Definition at line 142 of file DatabaseContext.cs.
@@ -1676,7 +1758,7 @@ Here is the caller graph for this function:
Definition at line 74 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.ChatController.Update().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.ChatController.Update().
@@ -1704,7 +1786,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 139 of file DatabaseContext.cs.
+Definition at line 145 of file DatabaseContext.cs.
@@ -1735,7 +1817,7 @@ Here is the caller graph for this function:
Definition at line 39 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.InstanceController.Delete().
@@ -1820,7 +1902,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 133 of file DatabaseContext.cs.
+Definition at line 139 of file DatabaseContext.cs.
@@ -1879,7 +1961,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 130 of file DatabaseContext.cs.
+Definition at line 136 of file DatabaseContext.cs.
@@ -1910,7 +1992,7 @@ Here is the caller graph for this function:
Definition at line 109 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.UserGroupController.Delete(), Tgstation.Server.Host.Controllers.UserGroupController.GetId(), Tgstation.Server.Host.Controllers.UserGroupController.Update(), and Tgstation.Server.Host.Controllers.UserController.Update().
+Referenced by Tgstation.Server.Host.Controllers.UserGroupController.Create(), Tgstation.Server.Host.Controllers.UserController.CreateNewUserFromModel(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.UserGroupController.Delete(), Tgstation.Server.Host.Controllers.UserGroupController.GetId(), Tgstation.Server.Host.Controllers.UserGroupController.Update(), and Tgstation.Server.Host.Controllers.UserController.Update().
@@ -1938,7 +2020,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 151 of file DatabaseContext.cs.
+Definition at line 157 of file DatabaseContext.cs.
@@ -1969,7 +2051,7 @@ Here is the caller graph for this function:
Definition at line 69 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.CheckAccessible(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions().
@@ -2028,7 +2110,7 @@ Here is the caller graph for this function:
Definition at line 34 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstanceController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.InstanceController.Delete(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Delete(), Tgstation.Server.Host.Controllers.InstanceController.GetId(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.GetId(), Tgstation.Server.Host.Controllers.InstanceController.GrantPermissions(), Tgstation.Server.Host.Controllers.InstanceController.List(), Tgstation.Server.Host.Controllers.DreamDaemonController.ReadImpl(), Tgstation.Server.Host.Controllers.DreamDaemonController.Update(), Tgstation.Server.Host.Controllers.InstancePermissionSetController.Update(), and Tgstation.Server.Host.Controllers.InstanceController.Update().
@@ -2087,7 +2169,7 @@ Here is the caller graph for this function:
Definition at line 79 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.JobController.Delete(), and Tgstation.Server.Host.Controllers.JobController.GetId().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Controllers.JobController.Delete(), and Tgstation.Server.Host.Controllers.JobController.GetId().
@@ -2146,7 +2228,7 @@ Here is the caller graph for this function:
Definition at line 99 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -2174,7 +2256,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 148 of file DatabaseContext.cs.
+Definition at line 154 of file DatabaseContext.cs.
@@ -2205,7 +2287,7 @@ Here is the caller graph for this function:
Definition at line 104 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.UserController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.UserController.Update().
@@ -2233,7 +2315,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 154 of file DatabaseContext.cs.
+Definition at line 160 of file DatabaseContext.cs.
@@ -2264,7 +2346,7 @@ Here is the caller graph for this function:
Definition at line 84 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
@@ -2292,7 +2374,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 145 of file DatabaseContext.cs.
+Definition at line 151 of file DatabaseContext.cs.
@@ -2351,7 +2433,7 @@ Here is the caller graph for this function:
Implements Tgstation.Server.Host.Database.IDatabaseContext.
-Definition at line 142 of file DatabaseContext.cs.
+Definition at line 148 of file DatabaseContext.cs.
@@ -2377,14 +2459,14 @@ Here is the caller graph for this function:
The DeleteBehavior for the CompileJob/RevisionInformation foreign key.
-Definition at line 159 of file DatabaseContext.cs.
+Definition at line 165 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.OnModelCreating().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.OnModelCreating().
-◆ RevInfoTestMerges
+◆ RevInfoTestMerges [1/2]
+
+
+◆ RevInfoTestMerges [2/2]
+
+
+
+
+
+ |
+
+ |
+
+getprivate |
+
+
+
@@ -2437,7 +2551,7 @@ Here is the caller graph for this function:
Definition at line 44 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext().
+Referenced by Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), and Tgstation.Server.Host.Controllers.InstanceController.Delete().
@@ -2470,7 +2584,7 @@ Here is the caller graph for this function:
-◆ TestMerges
+◆ TestMerges [1/2]
+
+
+◆ TestMerges [2/2]
+
+
+
+
+
+ |
+
+ |
+
+getprivate |
+
+
+
@@ -2523,7 +2669,7 @@ Here is the caller graph for this function:
Definition at line 29 of file DatabaseContext.cs.
-Referenced by Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Database.DatabaseContext.Migrate(), and Tgstation.Server.Host.Controllers.UserController.Update().
+Referenced by Tgstation.Server.Host.Controllers.InstancePermissionSetController.Create(), Tgstation.Server.Host.Controllers.UserController.Create(), Tgstation.Server.Host.Controllers.ApiRootController.CreateToken(), Tgstation.Server.Host.Database.DatabaseContext.DatabaseContext(), Tgstation.Server.Host.Database.DatabaseContext.Migrate(), and Tgstation.Server.Host.Controllers.UserController.Update().
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.map b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.map
index 9ed077a466..0b36c92efd 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.map
+++ b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.map
@@ -1,21 +1,23 @@
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.md5 b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.md5
index f49c7b22e6..b48b9d748f 100644
--- a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.md5
+++ b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.md5
@@ -1 +1 @@
-49131dddb2b7ebc675b829a7ed75e21a
\ No newline at end of file
+6e513eeea778ff79a17560731da7a7e9
\ No newline at end of file
diff --git a/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.png b/class_tgstation_1_1_server_1_1_host_1_1_database_1_1_database_context__coll__graph.png
index a3f54e748e2ec32f21a1328ef9bccd73ff50997b..f478c88f5cf0d5256552eb8e2b7df609a92b848e 100644
GIT binary patch
literal 221430
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 P$=-A1PR(i#AT@BE?vGH`t1QyI>-R2WMgLs
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 |