Aset (Assets)
Pendahuluan
Modul Aset mengelola aset jaringan yang dimiliki oleh organisasi. Aset mewakili infrastruktur yang dilindungi (server, jaringan, layanan) yang dipantau oleh sensor. Setiap aset dapat dikaitkan dengan organisasi, sensor, dan pengguna penanggung jawab (Person-In-Charge/PIC). Logika bisnis dienkapsulasi dalam AssetService dengan akses data melalui AssetRepository.
Controller
File: API/Controllers/Assets/AssetsController.cs
Rute: api/assets
Mewarisi: ControllerBase
Auth: [Authorize] (semua titik akhir memerlukan autentikasi)
Delegasi ke: IAssetService
Titik Akhir (Endpoints)
| Titik Akhir | Metode | Deskripsi |
|---|---|---|
api/assets | GET | Daftar semua aset di organisasi saat ini |
api/assets/{id} | GET | Ambil aset tunggal berdasarkan ID |
api/assets | POST | Buat aset baru |
api/assets/{id} | PUT | Perbarui aset yang sudah ada |
api/assets/{id} | DELETE | Hapus aset |
Pembatasan Organisasi
Titik akhir daftar mengambil ID organisasi dari klaim JWT:
var organizationId = UserHelper.GetOrganizationId(User);
if (!organizationId.HasValue)
{
return BadRequest(ApiEnvelope.Error("ID Organisasi tidak ditemukan dalam token", HttpContext.TraceIdentifier));
}
var assets = await _assetService.GetAssetsAsync(organizationId.Value);
Format Respons
Semua titik akhir menggunakan respons standar ApiEnvelope:
{
"success": true,
"data": {
"items": [...],
"count": 5
},
"errors": []
}
Entitas
File: Domain/Entities/Asset.cs
Tabel: assets
Namespace: Ravenxcope.Backend.Domain.Entities
| Kolom | Tipe | Batasan | Deskripsi |
|---|---|---|---|
id | uuid | PK | Kunci utama (UUIDv7) |
name | varchar(255) | Wajib | Nama tampilan aset |
description | text | Bisa null | Deskripsi aset |
location | varchar(255) | Bisa null | Lokasi fisik |
as_number | varchar(255) | Bisa null | Nomor Autonomous System |
dns | varchar(255) | Bisa null | Nama DNS atau IP |
organization_id | uuid | FK (bisa null) | Organisasi pemilik |
sensor_id | uuid | FK (bisa null) | Sensor terkait |
pic_id | uuid | FK (bisa null) | Penanggung jawab (User) |
created_at | timestamp | Stempel waktu pembuatan | |
updated_at | timestamp | Stempel waktu pembaruan terakhir |
Properti Navigasi
[ForeignKey("OrganizationId")]
public Organization? Organization { get; set; }
[ForeignKey("SensorId")]
public Sensor? Sensor { get; set; }
[ForeignKey("PicId")]
public User? Pic { get; set; }
Perilaku Kunci Asing (Foreign Key)
| Relasi | Perilaku |
|---|---|
| Organisasi → Aset | SetNull |
| Sensor → Aset | SetNull |
| Pengguna (PIC) → Aset | SetNull |
Semua FK menggunakan SetNull saat penghapusan — menghapus entitas induk akan mengatur FK menjadi null alih-alih menghapus aset secara cascade.
Layanan
File: Infrastructure/Services/AssetService.cs
Antarmuka: IAssetService
Masa Pakai (Lifetime): Scoped
Dependensi
| Dependensi | Tujuan |
|---|---|
IAssetRepository | Operasi CRUD Aset |
IOrganizationRepository | Validasi organisasi ada saat pembuatan |
ISensorRepository | Validasi sensor ada saat buat/update |
IUserRepository | Validasi user PIC ada saat buat/update |
Metode Layanan
| Metode | Mengembalikan | Deskripsi |
|---|---|---|
GetAssetsAsync(Guid orgId) | IReadOnlyList<AssetDto> | Daftar aset berdasarkan organisasi |
GetAssetAsync(Guid id) | AssetDto | Ambil aset tunggal dengan relasinya |
CreateAssetAsync(CreateAssetRequest) | AssetDto | Buat aset dengan validasi FK |
UpdateAssetAsync(Guid, UpdateAssetRequest) | AssetDto | Perbarui field aset dengan validasi FK |
DeleteAssetAsync(Guid id) | void | Hapus permanen aset |
Validasi
Metode ValidateReferencesAsync memvalidasi referensi FK sebelum pembuatan/pembaruan:
- Jika
organizationIddisediakan → verifikasi organisasi ada - Jika
sensorIddisediakan → verifikasi sensor ada - Jika
picIddisediakan → verifikasi pengguna ada
Melempar ArgumentException dengan pesan deskriptif jika validasi gagal.
Repositori
File: Infrastructure/Repositories/AssetRepository.cs
Antarmuka: IAssetRepository
Basis: EfRepository<Asset>
Masa Pakai (Lifetime): Scoped
Metode Kueri Khusus
| Metode | Mengembalikan | Deskripsi |
|---|---|---|
GetByOrganizationIdAsync(Guid) | IReadOnlyList<Asset> | Aset termasuk Organisasi, Sensor, dan PIC |
GetByIdWithRelationsAsync(Guid) | Asset? | Aset tunggal dengan semua properti navigasi dimuat |
DTO
DTO Permintaan
File: Application/DTOs/CreateAssetRequest.cs
| Properti | Tipe | Wajib | Deskripsi |
|---|---|---|---|
Name | string | Ya | Nama aset |
Description | string? | Tidak | Deskripsi aset |
Location | string? | Tidak | Lokasi fisik |
AsNumber | string? | Tidak | Nomor AS |
Dns | string? | Tidak | Nama DNS atau IP |
OrganizationId | Guid? | Tidak | Organisasi pemilik |
SensorId | Guid? | Tidak | Sensor terkait |
PicId | Guid? | Tidak | Penanggung jawab (User) |
File: Application/DTOs/UpdateAssetRequest.cs
Field yang sama dengan CreateAssetRequest kecuali OrganizationId (hanya Name, Description, Location, AsNumber, Dns, SensorId, PicId). Semua field bisa null untuk pembaruan parsial.
DTO Respons
File: Application/DTOs/AssetDtos.cs
public sealed record AssetDto(
Guid Id,
string Name,
string? Description,
string? Location,
string? AsNumber,
string? Dns,
Guid? OrganizationId,
string? OrganizationName, // Diambil dari navigasi Organization
Guid? SensorId,
string? SensorName, // Diambil dari navigasi Sensor
Guid? PicId,
string? PicName, // Diambil dari navigasi User (PIC)
DateTime CreatedAt,
DateTime UpdatedAt);
Izin yang Ditanam (Seeded Permissions)
Izin CRUD Aset ditanamkan di ApplicationDbContext.OnModelCreating:
| Izin | Slug |
|---|---|
| Create Asset | create-asset |
| Edit Asset | edit-asset |
| Delete Asset | delete-asset |
| Read Asset | read-asset |
Registrasi DI
Dalam ServiceCollectionExtensions.AddBackendServicesAsync:
services.AddScoped<IAssetRepository, AssetRepository>();
services.AddScoped<IAssetService, AssetService>();
Perbaikan di Masa Depan
Selesai
- Otorisasi berbasis izin pada titik akhir tulis (kebijakan
manage-assets).
Terbuka
- Menambahkan paginasi pada titik akhir daftar aset.
- Menambahkan impor/ekspor massal untuk aset.
- Menambahkan pelacakan status aset (aktif, dinonaktifkan, dll.).