150 lines
5.0 KiB
C#
150 lines
5.0 KiB
C#
using DysonNetwork.Sphere.Publisher;
|
|
using DysonNetwork.Sphere.Storage;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace DysonNetwork.Sphere.Developer;
|
|
|
|
public class CustomAppService(AppDatabase db, FileReferenceService fileRefService)
|
|
{
|
|
public async Task<CustomApp?> CreateAppAsync(
|
|
Publisher.Publisher pub,
|
|
CustomAppController.CustomAppRequest request
|
|
)
|
|
{
|
|
var app = new CustomApp
|
|
{
|
|
Slug = request.Slug!,
|
|
Name = request.Name!,
|
|
Description = request.Description,
|
|
Status = request.Status ?? CustomAppStatus.Developing,
|
|
Links = request.Links,
|
|
OauthConfig = request.OauthConfig,
|
|
PublisherId = pub.Id
|
|
};
|
|
|
|
if (request.PictureId is not null)
|
|
{
|
|
var picture = await db.Files.Where(f => f.Id == request.PictureId).FirstOrDefaultAsync();
|
|
if (picture is null)
|
|
throw new InvalidOperationException("Invalid picture id, unable to find the file on cloud.");
|
|
|
|
app.Picture = picture.ToReferenceObject();
|
|
|
|
// Create a new reference
|
|
await fileRefService.CreateReferenceAsync(
|
|
picture.Id,
|
|
"custom-apps.picture",
|
|
app.ResourceIdentifier
|
|
);
|
|
}
|
|
|
|
if (request.BackgroundId is not null)
|
|
{
|
|
var background = await db.Files.Where(f => f.Id == request.BackgroundId).FirstOrDefaultAsync();
|
|
if (background is null)
|
|
throw new InvalidOperationException("Invalid picture id, unable to find the file on cloud.");
|
|
|
|
app.Background = background.ToReferenceObject();
|
|
|
|
// Create a new reference
|
|
await fileRefService.CreateReferenceAsync(
|
|
background.Id,
|
|
"custom-apps.background",
|
|
app.ResourceIdentifier
|
|
);
|
|
}
|
|
|
|
db.CustomApps.Add(app);
|
|
await db.SaveChangesAsync();
|
|
|
|
return app;
|
|
}
|
|
|
|
public async Task<CustomApp?> GetAppAsync(Guid id, Guid? publisherId = null)
|
|
{
|
|
var query = db.CustomApps.Where(a => a.Id == id).AsQueryable();
|
|
if (publisherId.HasValue)
|
|
query = query.Where(a => a.PublisherId == publisherId.Value);
|
|
return await query.FirstOrDefaultAsync();
|
|
}
|
|
|
|
public async Task<List<CustomApp>> GetAppsByPublisherAsync(Guid publisherId)
|
|
{
|
|
return await db.CustomApps.Where(a => a.PublisherId == publisherId).ToListAsync();
|
|
}
|
|
|
|
public async Task<CustomApp?> UpdateAppAsync(CustomApp app, CustomAppController.CustomAppRequest request)
|
|
{
|
|
if (request.Slug is not null)
|
|
app.Slug = request.Slug;
|
|
if (request.Name is not null)
|
|
app.Name = request.Name;
|
|
if (request.Description is not null)
|
|
app.Description = request.Description;
|
|
if (request.Status is not null)
|
|
app.Status = request.Status.Value;
|
|
if (request.Links is not null)
|
|
app.Links = request.Links;
|
|
if (request.OauthConfig is not null)
|
|
app.OauthConfig = request.OauthConfig;
|
|
|
|
if (request.PictureId is not null)
|
|
{
|
|
var picture = await db.Files.Where(f => f.Id == request.PictureId).FirstOrDefaultAsync();
|
|
if (picture is null)
|
|
throw new InvalidOperationException("Invalid picture id, unable to find the file on cloud.");
|
|
|
|
if (app.Picture is not null)
|
|
await fileRefService.DeleteResourceReferencesAsync(app.ResourceIdentifier, "custom-apps.picture");
|
|
|
|
app.Picture = picture.ToReferenceObject();
|
|
|
|
// Create a new reference
|
|
await fileRefService.CreateReferenceAsync(
|
|
picture.Id,
|
|
"custom-apps.picture",
|
|
app.ResourceIdentifier
|
|
);
|
|
}
|
|
|
|
if (request.BackgroundId is not null)
|
|
{
|
|
var background = await db.Files.Where(f => f.Id == request.BackgroundId).FirstOrDefaultAsync();
|
|
if (background is null)
|
|
throw new InvalidOperationException("Invalid picture id, unable to find the file on cloud.");
|
|
|
|
if (app.Background is not null)
|
|
await fileRefService.DeleteResourceReferencesAsync(app.ResourceIdentifier, "custom-apps.background");
|
|
|
|
app.Background = background.ToReferenceObject();
|
|
|
|
// Create a new reference
|
|
await fileRefService.CreateReferenceAsync(
|
|
background.Id,
|
|
"custom-apps.background",
|
|
app.ResourceIdentifier
|
|
);
|
|
}
|
|
|
|
db.Update(app);
|
|
await db.SaveChangesAsync();
|
|
|
|
return app;
|
|
}
|
|
|
|
public async Task<bool> DeleteAppAsync(Guid id)
|
|
{
|
|
var app = await db.CustomApps.FindAsync(id);
|
|
if (app == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
db.CustomApps.Remove(app);
|
|
await db.SaveChangesAsync();
|
|
|
|
await fileRefService.DeleteResourceReferencesAsync(app.ResourceIdentifier);
|
|
|
|
return true;
|
|
}
|
|
} |