Implemented databases
This commit is contained in:
17
Moonlight/App/Models/Forms/DatabaseDataModel.cs
Normal file
17
Moonlight/App/Models/Forms/DatabaseDataModel.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Moonlight.App.Models.Forms;
|
||||
|
||||
public class DatabaseDataModel
|
||||
{
|
||||
[Required(ErrorMessage = "You need to enter a name")]
|
||||
[MinLength(8, ErrorMessage = "The name should be at least 8 characters long")]
|
||||
[MaxLength(32, ErrorMessage = "The database name should be maximal 32 characters")]
|
||||
[RegularExpression(@"^[a-z0-9]+$", ErrorMessage = "The name should only contain of lower case characters and numbers")]
|
||||
public string Name { get; set; } = "";
|
||||
|
||||
[Required(ErrorMessage = "You need to enter a password")]
|
||||
[MinLength(8, ErrorMessage = "The password should be at least 8 characters long")]
|
||||
[MaxLength(32, ErrorMessage = "The password name should be maximal 32 characters")]
|
||||
public string Password { get; set; } = "";
|
||||
}
|
||||
23
Moonlight/App/Models/Plesk/Requests/CreateDatabase.cs
Normal file
23
Moonlight/App/Models/Plesk/Requests/CreateDatabase.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.App.Models.Plesk.Requests;
|
||||
|
||||
public class CreateDatabase
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[JsonProperty("parent_domain")] public ParentDomainModel ParentDomain { get; set; } = new();
|
||||
|
||||
[JsonProperty("server_id")]
|
||||
public int ServerId { get; set; }
|
||||
|
||||
public class ParentDomainModel
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
}
|
||||
}
|
||||
15
Moonlight/App/Models/Plesk/Requests/CreateDatabaseUser.cs
Normal file
15
Moonlight/App/Models/Plesk/Requests/CreateDatabaseUser.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.App.Models.Plesk.Requests;
|
||||
|
||||
public class CreateDatabaseUser
|
||||
{
|
||||
[JsonProperty("login")]
|
||||
public string Login { get; set; }
|
||||
|
||||
[JsonProperty("password")]
|
||||
public string Password { get; set; }
|
||||
|
||||
[JsonProperty("database_id")]
|
||||
public int DatabaseId { get; set; }
|
||||
}
|
||||
15
Moonlight/App/Models/Plesk/Resources/Database.cs
Normal file
15
Moonlight/App/Models/Plesk/Resources/Database.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.App.Models.Plesk.Resources;
|
||||
|
||||
public class Database
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Type { get; set; }
|
||||
}
|
||||
30
Moonlight/App/Models/Plesk/Resources/DatabaseServer.cs
Normal file
30
Moonlight/App/Models/Plesk/Resources/DatabaseServer.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.App.Models.Plesk.Resources;
|
||||
|
||||
public class DatabaseServer
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[JsonProperty("host")]
|
||||
public string Host { get; set; }
|
||||
|
||||
[JsonProperty("port")]
|
||||
public int Port { get; set; }
|
||||
|
||||
[JsonProperty("type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
[JsonProperty("status")]
|
||||
public string Status { get; set; }
|
||||
|
||||
[JsonProperty("db_count")]
|
||||
public int DbCount { get; set; }
|
||||
|
||||
[JsonProperty("is_default")]
|
||||
public bool IsDefault { get; set; }
|
||||
|
||||
[JsonProperty("is_local")]
|
||||
public bool IsLocal { get; set; }
|
||||
}
|
||||
15
Moonlight/App/Models/Plesk/Resources/DatabaseUser.cs
Normal file
15
Moonlight/App/Models/Plesk/Resources/DatabaseUser.cs
Normal file
@@ -0,0 +1,15 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Moonlight.App.Models.Plesk.Resources;
|
||||
|
||||
public class DatabaseUser
|
||||
{
|
||||
[JsonProperty("id")]
|
||||
public int Id { get; set; }
|
||||
|
||||
[JsonProperty("login")]
|
||||
public string Login { get; set; }
|
||||
|
||||
[JsonProperty("database_id")]
|
||||
public int DatabaseId { get; set; }
|
||||
}
|
||||
@@ -130,10 +130,21 @@ public class WebsiteService
|
||||
return false;
|
||||
}
|
||||
|
||||
#region Get host
|
||||
|
||||
public async Task<string> GetHost(PleskServer pleskServer)
|
||||
{
|
||||
return (await PleskApiHelper.Get<ServerStatus>(pleskServer, "server")).Hostname;
|
||||
}
|
||||
|
||||
public async Task<string> GetHost(Website w)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
|
||||
return await GetHost(website.PleskServer);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private async Task<int> GetAdminAccount(PleskServer pleskServer)
|
||||
{
|
||||
@@ -147,6 +158,7 @@ public class WebsiteService
|
||||
return user.Id;
|
||||
}
|
||||
|
||||
#region SSL
|
||||
public async Task<string[]> GetSslCertificates(Website w)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
@@ -241,6 +253,90 @@ public class WebsiteService
|
||||
throw new DisplayException("An unknown error occured while disabling ssl certificate");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Databases
|
||||
|
||||
public async Task<Models.Plesk.Resources.Database[]> GetDatabases(Website w)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
|
||||
var dbs = await PleskApiHelper.Get<Models.Plesk.Resources.Database[]>(
|
||||
website.PleskServer,
|
||||
$"databases?domain={w.BaseDomain}"
|
||||
);
|
||||
|
||||
return dbs;
|
||||
}
|
||||
|
||||
public async Task CreateDatabase(Website w, string name, string password)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
|
||||
var server = await GetDefaultDatabaseServer(website);
|
||||
|
||||
if (server == null)
|
||||
throw new DisplayException("No database server marked as default found");
|
||||
|
||||
var dbReq = new CreateDatabase()
|
||||
{
|
||||
Name = name,
|
||||
Type = "mysql",
|
||||
ParentDomain = new()
|
||||
{
|
||||
Name = website.BaseDomain
|
||||
},
|
||||
ServerId = server.Id
|
||||
};
|
||||
|
||||
var db = await PleskApiHelper.Post<Models.Plesk.Resources.Database>(website.PleskServer, "databases", dbReq);
|
||||
|
||||
if (db == null)
|
||||
throw new DisplayException("Unable to create database via api");
|
||||
|
||||
var dbUserReq = new CreateDatabaseUser()
|
||||
{
|
||||
DatabaseId = db.Id,
|
||||
Login = name,
|
||||
Password = password
|
||||
};
|
||||
|
||||
await PleskApiHelper.Post(website.PleskServer, "dbusers", dbUserReq);
|
||||
}
|
||||
|
||||
public async Task DeleteDatabase(Website w, Models.Plesk.Resources.Database database)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
|
||||
var dbUsers = await PleskApiHelper.Get<DatabaseUser[]>(
|
||||
website.PleskServer,
|
||||
$"dbusers?dbId={database.Id}"
|
||||
);
|
||||
|
||||
foreach (var dbUser in dbUsers)
|
||||
{
|
||||
await PleskApiHelper.Delete(website.PleskServer, $"dbusers/{dbUser.Id}", null);
|
||||
}
|
||||
|
||||
await PleskApiHelper.Delete(website.PleskServer, $"databases/{database.Id}", null);
|
||||
}
|
||||
|
||||
public async Task<DatabaseServer?> GetDefaultDatabaseServer(PleskServer pleskServer)
|
||||
{
|
||||
var dbServers = await PleskApiHelper.Get<DatabaseServer[]>(pleskServer, "dbservers");
|
||||
|
||||
return dbServers.FirstOrDefault(x => x.IsDefault);
|
||||
}
|
||||
|
||||
public async Task<DatabaseServer?> GetDefaultDatabaseServer(Website w)
|
||||
{
|
||||
var website = EnsureData(w);
|
||||
|
||||
return await GetDefaultDatabaseServer(website.PleskServer);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public async Task<FileAccess> CreateFileAccess(Website w)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user