main
Ilham Wara Nugroho 2026-07-17 15:58:16 +07:00
parent 540f387d48
commit d0e1e97254
140 changed files with 5208 additions and 172 deletions

View File

@ -0,0 +1,273 @@
using Microsoft.AspNetCore.Mvc;
using kehati.Models.View;
namespace kehati.Controllers
{
public class FaunaController : Controller
{
public IActionResult Index()
{
var model = new HomeViewModel
{
FeaturedLocations = new List<LokasiModel>
{
new()
{
Slug = "tebet-eco-park",
Name = "Tebet Eco Park"
},
new()
{
Slug = "hutan-kota-srengseng",
Name = "Hutan Kota Srengseng",
Image = "loc-srengseng.jpg"
},
new()
{
Slug = "mangrove-angke",
Name = "Hutan Mangrove Angke"
}
},
FeaturedSpesies = new List<SpesiesModel>
{
new()
{
Slug = "pohon-trembesi",
Type = "flora",
CommonName = "Pohon Trembesi",
ScientificName = "Samanea saman",
Description =
"Pohon peneduh raksasa dengan tajuk lebar menyerupai payung. Sangat efektif menyerap karbon dioksida sehingga banyak ditanam di ruang publik Jakarta.",
Habitat = "Tumbuh baik di dataran rendah tropis, tanah subur, sinar matahari penuh.",
ConservationStatus = "Aman",
Image = "sp-trembesi.jpg",
LocationSlugs = new List<string>
{
"tebet-eco-park",
"hutan-kota-gbk",
"taman-menteng"
}
},
new()
{
Slug= "pohon-beringin",
Type= "flora",
CommonName= "Pohon Beringin",
ScientificName= "Ficus benjamina",
Description=
"Pohon rindang dengan akar udara khas yang menjuntai. Simbol keteduhan dan sering dijumpai di taman kota serta ruang publik Jakarta.",
Habitat= "Iklim tropis, tanah lembab, tahan terhadap polusi udara perkotaan.",
ConservationStatus= "Aman",
Image= "sp-beringin.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "mangrove-rhizophora",
Type= "flora",
CommonName= "Bakau Merah",
ScientificName= "Rhizophora mucronata",
Description=
"Tumbuhan bakau dengan akar tunjang khas. Berfungsi sebagai benteng alami pesisir Jakarta terhadap abrasi dan intrusi air laut.",
Habitat= "Kawasan pesisir berlumpur, muara sungai, air payau.",
ConservationStatus= "Dilindungi",
Image= "sp-mangrove.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "bunga-kamboja",
Type= "flora",
CommonName= "Kamboja Putih",
ScientificName= "Plumeria alba",
Description=
"Pohon hias berbunga harum dengan kelopak putih dan kuning di tengah. Populer di pekarangan dan taman kota.",
Habitat= "Daerah tropis kering, tanah berdrainase baik.",
ConservationStatus= "Aman",
Image= "sp-kamboja.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng"}
},
new()
{
Slug= "anggrek-bulan",
Type= "flora",
CommonName= "Anggrek Bulan",
ScientificName= "Phalaenopsis amabilis",
Description=
"Bunga nasional Indonesia (Puspa Pesona). Berkelopak lebar putih murni, tumbuh menempel pada batang pohon.",
Habitat= "Epifit pada pohon di hutan tropis lembab.",
ConservationStatus= "Rentan",
Image= "sp-anggrek.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "tebet-eco-park"}
},
new()
{
Slug= "bambu-kuning",
Type= "flora",
CommonName= "Bambu Kuning",
ScientificName= "Bambusa vulgaris",
Description=
"Rumpun bambu berbatang kuning cerah yang tumbuh cepat. Berperan penting menyerap air tanah dan mencegah erosi.",
Habitat= "Tanah lembab di tepi sungai, taman, dan hutan kota.",
ConservationStatus= "Aman",
Image= "sp-bambu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "burung-kutilang",
Type= "fauna",
CommonName= "Burung Kutilang",
ScientificName= "Pycnonotus aurigaster",
Description=
"Burung pengicau kecil dengan tunggir kuning cerah. Salah satu burung liar paling umum di taman-taman Jakarta.",
Habitat= "Taman kota, pekarangan, hutan sekunder.",
ConservationStatus= "Aman",
Image= "sp-kutilang.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "burung-madu-sriganti",
Type= "fauna",
CommonName= "Burung Madu Sriganti",
ScientificName= "Cinnyris jugularis",
Description=
"Burung kecil berwarna cerah, jantan berdada hitam berkilau. Penghisap nektar bunga di taman dan hutan kota.",
Habitat= "Taman berbunga, semak berbunga, pinggir hutan.",
ConservationStatus= "Dilindungi",
Image= "sp-madu-sriganti.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng", "mangrove-pik"}
},
new()
{
Slug= "kupu-kupu-raja",
Type= "fauna",
CommonName= "Kupu-kupu Raja",
ScientificName= "Papilio memnon",
Description=
"Kupu-kupu besar berwarna hitam kebiruan dengan sayap lebar. Penyerbuk penting bagi berbagai tanaman berbunga.",
Habitat= "Taman berbunga, hutan sekunder, pinggir sungai.",
ConservationStatus= "Aman",
Image= "sp-kupu-kupu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "biawak-air",
Type= "fauna",
CommonName= "Biawak Air",
ScientificName= "Varanus salvator",
Description=
"Reptil besar semi-akuatik dengan lidah bercabang. Predator alami yang membantu mengendalikan populasi tikus di ekosistem kota.",
Habitat= "Rawa, sungai, hutan mangrove.",
ConservationStatus= "Dilindungi",
Image= "sp-biawak.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "monyet-ekor-panjang",
Type= "fauna",
CommonName= "Monyet Ekor Panjang",
ScientificName= "Macaca fascicularis",
Description=
"Primata berbulu abu-abu kecoklatan dengan ekor panjang. Hidup berkelompok di kawasan hutan yang tersisa.",
Habitat= "Hutan mangrove, hutan sekunder, tepi sungai.",
ConservationStatus= "Rentan",
Image= "sp-monyet.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
}
}
};
return View(model);
}
public IActionResult Detail(string slug)
{
ViewBag.Slug = slug;
var sp = new SpesiesModel
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
};
var model = new HomeViewModel
{
Spesies = sp,
FeaturedLocations = new List<LokasiModel>
{
new()
{
Slug = "tebet-eco-park",
Name = "Tebet Eco Park",
Region = "Jakarta Selatan",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20,
Image = "loc-tebet.jpg"
},
new()
{
Slug = "hutan-kota-srengseng",
Name = "Hutan Kota Srengseng",
Image = "loc-srengseng.jpg",
Region = "Jakarta Barat",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20
},
new()
{
Slug = "mangrove-angke",
Name = "Hutan Mangrove Angke",
Region = "Jakarta Barat",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20,
Image = "loc-mangrove-pik.jpg"
}
}
};
return View(model);
}
}
}

View File

@ -0,0 +1,273 @@
using Microsoft.AspNetCore.Mvc;
using kehati.Models.View;
namespace kehati.Controllers
{
public class FloraController : Controller
{
public IActionResult Index()
{
var model = new HomeViewModel
{
FeaturedLocations = new List<LokasiModel>
{
new()
{
Slug = "tebet-eco-park",
Name = "Tebet Eco Park"
},
new()
{
Slug = "hutan-kota-srengseng",
Name = "Hutan Kota Srengseng",
Image = "loc-srengseng.jpg"
},
new()
{
Slug = "mangrove-angke",
Name = "Hutan Mangrove Angke"
}
},
FeaturedSpesies = new List<SpesiesModel>
{
new()
{
Slug = "pohon-trembesi",
Type = "flora",
CommonName = "Pohon Trembesi",
ScientificName = "Samanea saman",
Description =
"Pohon peneduh raksasa dengan tajuk lebar menyerupai payung. Sangat efektif menyerap karbon dioksida sehingga banyak ditanam di ruang publik Jakarta.",
Habitat = "Tumbuh baik di dataran rendah tropis, tanah subur, sinar matahari penuh.",
ConservationStatus = "Aman",
Image = "sp-trembesi.jpg",
LocationSlugs = new List<string>
{
"tebet-eco-park",
"hutan-kota-gbk",
"taman-menteng"
}
},
new()
{
Slug= "pohon-beringin",
Type= "flora",
CommonName= "Pohon Beringin",
ScientificName= "Ficus benjamina",
Description=
"Pohon rindang dengan akar udara khas yang menjuntai. Simbol keteduhan dan sering dijumpai di taman kota serta ruang publik Jakarta.",
Habitat= "Iklim tropis, tanah lembab, tahan terhadap polusi udara perkotaan.",
ConservationStatus= "Aman",
Image= "sp-beringin.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "mangrove-rhizophora",
Type= "flora",
CommonName= "Bakau Merah",
ScientificName= "Rhizophora mucronata",
Description=
"Tumbuhan bakau dengan akar tunjang khas. Berfungsi sebagai benteng alami pesisir Jakarta terhadap abrasi dan intrusi air laut.",
Habitat= "Kawasan pesisir berlumpur, muara sungai, air payau.",
ConservationStatus= "Dilindungi",
Image= "sp-mangrove.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "bunga-kamboja",
Type= "flora",
CommonName= "Kamboja Putih",
ScientificName= "Plumeria alba",
Description=
"Pohon hias berbunga harum dengan kelopak putih dan kuning di tengah. Populer di pekarangan dan taman kota.",
Habitat= "Daerah tropis kering, tanah berdrainase baik.",
ConservationStatus= "Aman",
Image= "sp-kamboja.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng"}
},
new()
{
Slug= "anggrek-bulan",
Type= "flora",
CommonName= "Anggrek Bulan",
ScientificName= "Phalaenopsis amabilis",
Description=
"Bunga nasional Indonesia (Puspa Pesona). Berkelopak lebar putih murni, tumbuh menempel pada batang pohon.",
Habitat= "Epifit pada pohon di hutan tropis lembab.",
ConservationStatus= "Rentan",
Image= "sp-anggrek.jpg",
LocationSlugs = new List<string>
{"hutan-kota-srengseng", "tebet-eco-park"}
},
new()
{
Slug= "bambu-kuning",
Type= "flora",
CommonName= "Bambu Kuning",
ScientificName= "Bambusa vulgaris",
Description=
"Rumpun bambu berbatang kuning cerah yang tumbuh cepat. Berperan penting menyerap air tanah dan mencegah erosi.",
Habitat= "Tanah lembab di tepi sungai, taman, dan hutan kota.",
ConservationStatus= "Aman",
Image= "sp-bambu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "burung-kutilang",
Type= "fauna",
CommonName= "Burung Kutilang",
ScientificName= "Pycnonotus aurigaster",
Description=
"Burung pengicau kecil dengan tunggir kuning cerah. Salah satu burung liar paling umum di taman-taman Jakarta.",
Habitat= "Taman kota, pekarangan, hutan sekunder.",
ConservationStatus= "Aman",
Image= "sp-kutilang.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "taman-menteng", "hutan-kota-gbk"}
},
new()
{
Slug= "burung-madu-sriganti",
Type= "fauna",
CommonName= "Burung Madu Sriganti",
ScientificName= "Cinnyris jugularis",
Description=
"Burung kecil berwarna cerah, jantan berdada hitam berkilau. Penghisap nektar bunga di taman dan hutan kota.",
Habitat= "Taman berbunga, semak berbunga, pinggir hutan.",
ConservationStatus= "Dilindungi",
Image= "sp-madu-sriganti.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng", "mangrove-pik"}
},
new()
{
Slug= "kupu-kupu-raja",
Type= "fauna",
CommonName= "Kupu-kupu Raja",
ScientificName= "Papilio memnon",
Description=
"Kupu-kupu besar berwarna hitam kebiruan dengan sayap lebar. Penyerbuk penting bagi berbagai tanaman berbunga.",
Habitat= "Taman berbunga, hutan sekunder, pinggir sungai.",
ConservationStatus= "Aman",
Image= "sp-kupu-kupu.jpg",
LocationSlugs = new List<string>
{"tebet-eco-park", "hutan-kota-srengseng"}
},
new()
{
Slug= "biawak-air",
Type= "fauna",
CommonName= "Biawak Air",
ScientificName= "Varanus salvator",
Description=
"Reptil besar semi-akuatik dengan lidah bercabang. Predator alami yang membantu mengendalikan populasi tikus di ekosistem kota.",
Habitat= "Rawa, sungai, hutan mangrove.",
ConservationStatus= "Dilindungi",
Image= "sp-biawak.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "monyet-ekor-panjang",
Type= "fauna",
CommonName= "Monyet Ekor Panjang",
ScientificName= "Macaca fascicularis",
Description=
"Primata berbulu abu-abu kecoklatan dengan ekor panjang. Hidup berkelompok di kawasan hutan yang tersisa.",
Habitat= "Hutan mangrove, hutan sekunder, tepi sungai.",
ConservationStatus= "Rentan",
Image= "sp-monyet.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
},
new()
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
}
}
};
return View(model);
}
public IActionResult Detail(string slug)
{
ViewBag.Slug = slug;
var sp = new SpesiesModel
{
Slug= "elang-bondol",
Type= "fauna",
CommonName= "Elang Bondol",
ScientificName= "Haliastur indus",
Description=
"Elang berkepala putih dengan tubuh coklat kemerahan. Maskot Provinsi DKI Jakarta dan simbol kekayaan hayati pesisir.",
Habitat= "Pesisir, mangrove, muara sungai.",
ConservationStatus= "Dilindungi",
Image= "sp-elang-bondol.jpg",
LocationSlugs = new List<string>
{"muara-angke", "mangrove-pik"}
};
var model = new HomeViewModel
{
Spesies = sp,
FeaturedLocations = new List<LokasiModel>
{
new()
{
Slug = "tebet-eco-park",
Name = "Tebet Eco Park",
Region = "Jakarta Selatan",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20,
Image = "loc-tebet.jpg"
},
new()
{
Slug = "hutan-kota-srengseng",
Name = "Hutan Kota Srengseng",
Image = "loc-srengseng.jpg",
Region = "Jakarta Barat",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20
},
new()
{
Slug = "mangrove-angke",
Name = "Hutan Mangrove Angke",
Region = "Jakarta Barat",
Area = "15.3 Ha",
FloraCount = 45,
FaunaCount = 20,
Image = "loc-mangrove-pik.jpg"
}
}
};
return View(model);
}
}
}

View File

@ -1,20 +1,40 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using kehati.Models.View;
using kehati.Database;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace kehati.Controllers;
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
private readonly ApplicationDbContext db;
public HomeController(ILogger<HomeController> logger)
public HomeController(ILogger<HomeController> logger,ApplicationDbContext context)
{
_logger = logger;
db = context;
}
public IActionResult Index()
public async Task<IActionResult> Index()
{
//memanggil data lokasi dari master DB Lokasi
ViewBag.lokasiHome = await db.Lokasi
.OrderByDescending(l => l.MsLokasiId)
.Take(3)
.ToListAsync();
ViewBag.tumbuhanHome = await db.Tumbuhan
.OrderByDescending(l => l.MsTumbuhanId)
.Take(4)
.ToListAsync();
ViewBag.faunaHome = await db.Fauna
.OrderByDescending(l => l.MsFaunaId)
.Take(4)
.ToListAsync();
var model = new HomeViewModel
{
Statistik = new StatistikHomeModel

View File

@ -1,23 +0,0 @@
using Microsoft.EntityFrameworkCore;
using kehati.Models.View;
namespace kehati.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(
DbContextOptions<ApplicationDbContext> options
) : base(options)
{
}
public DbSet<LokasiModel> Lokasi { get; set; }
public DbSet<SpesiesModel> Spesies { get; set; }
}
}

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore;
using kehati.Models.Entity.Master;
using kehati.Models.Entity;
namespace kehati.Database
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(
DbContextOptions<ApplicationDbContext> options
) : base(options)
{
}
public DbSet<User> User { get; set; }
public DbSet<Lokasi> Lokasi { get; set; }
public DbSet<Famili> Famili { get; set; }
public DbSet<Group> Group { get; set; }
public DbSet<Habitat> Habitat { get; set; }
public DbSet<LokasiTumbuhan> LokasiTumbuhan { get; set; }
public DbSet<Menu> Menu { get; set; }
public DbSet<Tumbuhan> Tumbuhan { get; set; }
public DbSet<Fauna> Fauna { get; set; }
}
}

View File

@ -0,0 +1,290 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using kehati.Database;
#nullable disable
namespace kehati.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20260717065158_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("kehati.Models.Entity.Master.Famili", b =>
{
b.Property<int>("MsFamiliId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsFamiliId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsFamiliId");
b.ToTable("ms_famili");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Group", b =>
{
b.Property<int>("MsGroupId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsGroupId"));
b.Property<string>("Alias")
.IsRequired()
.HasColumnType("text");
b.Property<int>("CreatedBy")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UpdatedBy")
.HasColumnType("integer");
b.HasKey("MsGroupId");
b.ToTable("ms_group");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Habitat", b =>
{
b.Property<int>("MsHabitusId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsHabitusId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsHabitusId");
b.ToTable("ms_habitus");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Lokasi", b =>
{
b.Property<int>("MsLokasiId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiId"));
b.Property<string>("Area")
.HasColumnType("text")
.HasColumnName("area");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<int?>("Kode")
.HasColumnType("integer")
.HasColumnName("kode");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Region")
.HasColumnType("text")
.HasColumnName("region");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("Status")
.HasColumnType("text")
.HasColumnName("status");
b.HasKey("MsLokasiId");
b.ToTable("ms_lokasi");
});
modelBuilder.Entity("kehati.Models.Entity.Master.LokasiTumbuhan", b =>
{
b.Property<int>("MsLokasiTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiTumbuhanId"));
b.Property<int>("MsLokasiId")
.HasColumnType("integer")
.HasColumnName("ms_lokasi_id");
b.Property<int>("MsTumbuhanId")
.HasColumnType("integer")
.HasColumnName("ms_tumbuhan_id");
b.HasKey("MsLokasiTumbuhanId");
b.ToTable("ms_lokasi_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Menu", b =>
{
b.Property<int>("MsMenuId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsMenuId"));
b.Property<string>("MenuIcon")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_icon");
b.Property<string>("MenuType")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_type");
b.Property<string>("Module")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Ordering")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ParentId")
.HasColumnType("integer")
.HasColumnName("parent_id");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Url")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsMenuId");
b.ToTable("ms_menu");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Tumbuhan", b =>
{
b.Property<int>("MsTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsTumbuhanId"));
b.Property<string>("Cites")
.HasColumnType("text")
.HasColumnName("cites");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<string>("Iucn")
.HasColumnType("text")
.HasColumnName("iucn");
b.Property<int>("MsFamiliId")
.HasColumnType("integer")
.HasColumnName("ms_famili_id");
b.Property<int>("MsHabitatId")
.HasColumnType("integer")
.HasColumnName("ms_habitus_id");
b.Property<string>("NamaIlmiah")
.HasColumnType("text")
.HasColumnName("name_ilmiah");
b.Property<string>("Name")
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("StatusPerlindungan")
.HasColumnType("text")
.HasColumnName("status_perlindungan");
b.Property<bool>("TanamanKhasJakarta")
.HasColumnType("boolean")
.HasColumnName("tanaman_khas_jakarta");
b.HasKey("MsTumbuhanId");
b.ToTable("ms_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<int>("MsGroupId")
.HasColumnType("integer")
.HasColumnName("ms_group_id");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Username")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("users");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,178 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace kehati.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ms_famili",
columns: table => new
{
MsFamiliId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_famili", x => x.MsFamiliId);
});
migrationBuilder.CreateTable(
name: "ms_group",
columns: table => new
{
MsGroupId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false),
Alias = table.Column<string>(type: "text", nullable: false),
Status = table.Column<string>(type: "text", nullable: false),
CreatedBy = table.Column<int>(type: "integer", nullable: false),
UpdatedBy = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_group", x => x.MsGroupId);
});
migrationBuilder.CreateTable(
name: "ms_habitus",
columns: table => new
{
MsHabitusId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
Name = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_habitus", x => x.MsHabitusId);
});
migrationBuilder.CreateTable(
name: "ms_lokasi",
columns: table => new
{
MsLokasiId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
name = table.Column<string>(type: "text", nullable: false),
kode = table.Column<int>(type: "integer", nullable: true),
status = table.Column<string>(type: "text", nullable: true),
image = table.Column<string>(type: "text", nullable: true),
slug = table.Column<string>(type: "text", nullable: true),
region = table.Column<string>(type: "text", nullable: true),
area = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_lokasi", x => x.MsLokasiId);
});
migrationBuilder.CreateTable(
name: "ms_lokasi_tumbuhan",
columns: table => new
{
MsLokasiTumbuhanId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ms_tumbuhan_id = table.Column<int>(type: "integer", nullable: false),
ms_lokasi_id = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_lokasi_tumbuhan", x => x.MsLokasiTumbuhanId);
});
migrationBuilder.CreateTable(
name: "ms_menu",
columns: table => new
{
MsMenuId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
parent_id = table.Column<int>(type: "integer", nullable: false),
Title = table.Column<string>(type: "text", nullable: false),
Module = table.Column<string>(type: "text", nullable: false),
Url = table.Column<string>(type: "text", nullable: false),
menu_type = table.Column<string>(type: "text", nullable: false),
menu_icon = table.Column<string>(type: "text", nullable: false),
Ordering = table.Column<string>(type: "text", nullable: false),
Status = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_menu", x => x.MsMenuId);
});
migrationBuilder.CreateTable(
name: "ms_tumbuhan",
columns: table => new
{
MsTumbuhanId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ms_famili_id = table.Column<int>(type: "integer", nullable: false),
ms_habitus_id = table.Column<int>(type: "integer", nullable: false),
name = table.Column<string>(type: "text", nullable: true),
name_ilmiah = table.Column<string>(type: "text", nullable: true),
tanaman_khas_jakarta = table.Column<bool>(type: "boolean", nullable: false),
status_perlindungan = table.Column<string>(type: "text", nullable: true),
iucn = table.Column<string>(type: "text", nullable: true),
cites = table.Column<string>(type: "text", nullable: true),
slug = table.Column<string>(type: "text", nullable: true),
image = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ms_tumbuhan", x => x.MsTumbuhanId);
});
migrationBuilder.CreateTable(
name: "users",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ms_group_id = table.Column<int>(type: "integer", nullable: false),
Name = table.Column<string>(type: "text", nullable: false),
Username = table.Column<string>(type: "text", nullable: false),
Email = table.Column<string>(type: "text", nullable: false),
Password = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_users", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ms_famili");
migrationBuilder.DropTable(
name: "ms_group");
migrationBuilder.DropTable(
name: "ms_habitus");
migrationBuilder.DropTable(
name: "ms_lokasi");
migrationBuilder.DropTable(
name: "ms_lokasi_tumbuhan");
migrationBuilder.DropTable(
name: "ms_menu");
migrationBuilder.DropTable(
name: "ms_tumbuhan");
migrationBuilder.DropTable(
name: "users");
}
}
}

View File

@ -0,0 +1,290 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using kehati.Database;
#nullable disable
namespace kehati.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
[Migration("20260717070105_AddFaunaTable")]
partial class AddFaunaTable
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("kehati.Models.Entity.Master.Famili", b =>
{
b.Property<int>("MsFamiliId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsFamiliId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsFamiliId");
b.ToTable("ms_famili");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Group", b =>
{
b.Property<int>("MsGroupId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsGroupId"));
b.Property<string>("Alias")
.IsRequired()
.HasColumnType("text");
b.Property<int>("CreatedBy")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UpdatedBy")
.HasColumnType("integer");
b.HasKey("MsGroupId");
b.ToTable("ms_group");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Habitat", b =>
{
b.Property<int>("MsHabitusId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsHabitusId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsHabitusId");
b.ToTable("ms_habitus");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Lokasi", b =>
{
b.Property<int>("MsLokasiId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiId"));
b.Property<string>("Area")
.HasColumnType("text")
.HasColumnName("area");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<int?>("Kode")
.HasColumnType("integer")
.HasColumnName("kode");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Region")
.HasColumnType("text")
.HasColumnName("region");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("Status")
.HasColumnType("text")
.HasColumnName("status");
b.HasKey("MsLokasiId");
b.ToTable("ms_lokasi");
});
modelBuilder.Entity("kehati.Models.Entity.Master.LokasiTumbuhan", b =>
{
b.Property<int>("MsLokasiTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiTumbuhanId"));
b.Property<int>("MsLokasiId")
.HasColumnType("integer")
.HasColumnName("ms_lokasi_id");
b.Property<int>("MsTumbuhanId")
.HasColumnType("integer")
.HasColumnName("ms_tumbuhan_id");
b.HasKey("MsLokasiTumbuhanId");
b.ToTable("ms_lokasi_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Menu", b =>
{
b.Property<int>("MsMenuId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsMenuId"));
b.Property<string>("MenuIcon")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_icon");
b.Property<string>("MenuType")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_type");
b.Property<string>("Module")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Ordering")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ParentId")
.HasColumnType("integer")
.HasColumnName("parent_id");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Url")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsMenuId");
b.ToTable("ms_menu");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Tumbuhan", b =>
{
b.Property<int>("MsTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsTumbuhanId"));
b.Property<string>("Cites")
.HasColumnType("text")
.HasColumnName("cites");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<string>("Iucn")
.HasColumnType("text")
.HasColumnName("iucn");
b.Property<int>("MsFamiliId")
.HasColumnType("integer")
.HasColumnName("ms_famili_id");
b.Property<int>("MsHabitatId")
.HasColumnType("integer")
.HasColumnName("ms_habitus_id");
b.Property<string>("NamaIlmiah")
.HasColumnType("text")
.HasColumnName("name_ilmiah");
b.Property<string>("Name")
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("StatusPerlindungan")
.HasColumnType("text")
.HasColumnName("status_perlindungan");
b.Property<bool>("TanamanKhasJakarta")
.HasColumnType("boolean")
.HasColumnName("tanaman_khas_jakarta");
b.HasKey("MsTumbuhanId");
b.ToTable("ms_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<int>("MsGroupId")
.HasColumnType("integer")
.HasColumnName("ms_group_id");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Username")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("users");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -0,0 +1,53 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace kehati.Migrations
{
/// <inheritdoc />
public partial class AddFaunaTable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ms_fauna",
columns: table => new
{
MsFaunaId = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
ms_famili_id = table.Column<int>(type: "integer", nullable: false),
ms_habitus_id = table.Column<int>(type: "integer", nullable: false),
slug = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
name = table.Column<string>(type: "character varying(200)", maxLength: 200, nullable: false),
nama_ilmiah = table.Column<string>(type: "text", nullable: false),
status = table.Column<string>(type: "text", nullable: true),
image = table.Column<string>(type: "text", nullable: true),
created_at = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
updated_at = table.Column<DateTime>(type: "timestamp with time zone", nullable: true),
},
constraints: table =>
{
table.PrimaryKey("PK_MsFaunaId", x => x.MsFaunaId);
table.ForeignKey(
name: "FK_FamiliId",
column: x => x.ms_famili_id,
principalTable: "ms_famili",
principalColumn: "MsFamiliId");
table.ForeignKey(
name: "FK_HabitusId",
column: x => x.ms_habitus_id,
principalTable: "ms_habitus",
principalColumn: "MsHabitusId");
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ms_fauna");
}
}
}

View File

@ -0,0 +1,287 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using kehati.Database;
#nullable disable
namespace kehati.Migrations
{
[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("kehati.Models.Entity.Master.Famili", b =>
{
b.Property<int>("MsFamiliId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsFamiliId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsFamiliId");
b.ToTable("ms_famili");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Group", b =>
{
b.Property<int>("MsGroupId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsGroupId"));
b.Property<string>("Alias")
.IsRequired()
.HasColumnType("text");
b.Property<int>("CreatedBy")
.HasColumnType("integer");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<int>("UpdatedBy")
.HasColumnType("integer");
b.HasKey("MsGroupId");
b.ToTable("ms_group");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Habitat", b =>
{
b.Property<int>("MsHabitusId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsHabitusId"));
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsHabitusId");
b.ToTable("ms_habitus");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Lokasi", b =>
{
b.Property<int>("MsLokasiId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiId"));
b.Property<string>("Area")
.HasColumnType("text")
.HasColumnName("area");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<int?>("Kode")
.HasColumnType("integer")
.HasColumnName("kode");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Region")
.HasColumnType("text")
.HasColumnName("region");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("Status")
.HasColumnType("text")
.HasColumnName("status");
b.HasKey("MsLokasiId");
b.ToTable("ms_lokasi");
});
modelBuilder.Entity("kehati.Models.Entity.Master.LokasiTumbuhan", b =>
{
b.Property<int>("MsLokasiTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsLokasiTumbuhanId"));
b.Property<int>("MsLokasiId")
.HasColumnType("integer")
.HasColumnName("ms_lokasi_id");
b.Property<int>("MsTumbuhanId")
.HasColumnType("integer")
.HasColumnName("ms_tumbuhan_id");
b.HasKey("MsLokasiTumbuhanId");
b.ToTable("ms_lokasi_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Menu", b =>
{
b.Property<int>("MsMenuId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsMenuId"));
b.Property<string>("MenuIcon")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_icon");
b.Property<string>("MenuType")
.IsRequired()
.HasColumnType("text")
.HasColumnName("menu_type");
b.Property<string>("Module")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Ordering")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ParentId")
.HasColumnType("integer")
.HasColumnName("parent_id");
b.Property<string>("Status")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Title")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Url")
.IsRequired()
.HasColumnType("text");
b.HasKey("MsMenuId");
b.ToTable("ms_menu");
});
modelBuilder.Entity("kehati.Models.Entity.Master.Tumbuhan", b =>
{
b.Property<int>("MsTumbuhanId")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("MsTumbuhanId"));
b.Property<string>("Cites")
.HasColumnType("text")
.HasColumnName("cites");
b.Property<string>("Image")
.HasColumnType("text")
.HasColumnName("image");
b.Property<string>("Iucn")
.HasColumnType("text")
.HasColumnName("iucn");
b.Property<int>("MsFamiliId")
.HasColumnType("integer")
.HasColumnName("ms_famili_id");
b.Property<int>("MsHabitatId")
.HasColumnType("integer")
.HasColumnName("ms_habitus_id");
b.Property<string>("NamaIlmiah")
.HasColumnType("text")
.HasColumnName("name_ilmiah");
b.Property<string>("Name")
.HasColumnType("text")
.HasColumnName("name");
b.Property<string>("Slug")
.HasColumnType("text")
.HasColumnName("slug");
b.Property<string>("StatusPerlindungan")
.HasColumnType("text")
.HasColumnName("status_perlindungan");
b.Property<bool>("TanamanKhasJakarta")
.HasColumnType("boolean")
.HasColumnName("tanaman_khas_jakarta");
b.HasKey("MsTumbuhanId");
b.ToTable("ms_tumbuhan");
});
modelBuilder.Entity("kehati.Models.Entity.User", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<string>("Email")
.IsRequired()
.HasColumnType("text");
b.Property<int>("MsGroupId")
.HasColumnType("integer")
.HasColumnName("ms_group_id");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Password")
.IsRequired()
.HasColumnType("text");
b.Property<string>("Username")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.ToTable("users");
});
#pragma warning restore 612, 618
}
}
}

View File

@ -1,9 +1,12 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_famili")]
public class Famili
{
[Key]
public int MsFamiliId { get; set; }
public string Name { get; set; } = "";
[Column("name")]
public string? Name { get; set; } = "";
}

View File

@ -0,0 +1,23 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_fauna")]
public class Fauna
{
[Key]
public int MsFaunaId { get; set; }
[Column("ms_famili_id")]
public string? MsFamiliId {get;set;} = "";
[Column("ms_habitus_id")]
public string? MsHabitusId {get;set;} = "";
[Column("slug")]
public string? Slug {get;set;} = "";
[Column("name")]
public string? Name {get;set;} = "";
[Column("nama_ilmiah")]
public string? NamaIlmiah {get;set;} = "";
[Column("status")]
public string? Status {get;set;} = "";
[Column("image")]
public string? Image {get;set;} = "";
}

View File

@ -1,13 +1,20 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_group")]
public class Group
{
[Key]
public int MsGroupId { get; set; }
public string Name { get; set; } = "";
public string Alias { get; set; } = "";
public string Status { get; set; } = "";
public int CreatedBy { get; set; }
public int UpdatedBy { get; set; }
[Column("name")]
public string? Name { get; set; } = "";
[Column("alias")]
public string? Alias { get; set; } = "";
[Column("status")]
public string? Status { get; set; } = "";
[Column("created_by")]
public int? CreatedBy { get; set; }
[Column("updated_by")]
public int? UpdatedBy { get; set; }
}

View File

@ -1,9 +1,12 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_habitus")]
public class Habitat
{
[Key]
public int MsHabitusId { get; set; }
public string Name { get; set; } = "";
[Column("name")]
public string? Name { get; set; } = "";
}

View File

@ -1,11 +1,24 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_lokasi")]
public class Lokasi
{
[Key]
public int MsLokasiId { get; set; }
[Column("name")]
public string Name { get; set; } = "";
public string Kode { get; set; } = "";
public string Status { get; set; } = "";
[Column("kode")]
public int? Kode { get; set; }
[Column("status")]
public string? Status { get; set; } = "";
[Column("image")]
public string? Image { get; set; } = "";
[Column("slug")]
public string? Slug { get; set; } = "";
[Column("region")]
public string? Region { get; set; } = "";
[Column("area")]
public string? Area { get; set; } = "";
}

View File

@ -1,8 +1,10 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_lokasi_tumbuhan")]
public class LokasiTumbuhan
{
[Key]
public int MsLokasiTumbuhanId { get; set; }
[Column("ms_tumbuhan_id")]
public int MsTumbuhanId { get; set; }

View File

@ -1,19 +1,26 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_menu")]
public class Menu
{
[Key]
public int MsMenuId { get; set; }
[Column("parent_id")]
public int ParentId { get; set; }
public string Title { get; set; } = "";
public string Module { get; set; } = "";
public string Url { get; set; } = "";
public int? ParentId { get; set; }
[Column("title")]
public string? Title { get; set; } = "";
[Column("module")]
public string? Module { get; set; } = "";
[Column("url")]
public string? Url { get; set; } = "";
[Column("menu_type")]
public string MenuType { get; set; } = "";
public string? MenuType { get; set; } = "";
[Column("menu_icon")]
public string MenuIcon { get; set; } = "";
public string? MenuIcon { get; set; } = "";
[Column("ordering")]
public string Ordering { get; set; } = "";
public string Status { get; set; } = "";
public string? Ordering { get; set; } = "";
[Column("status")]
public string? Status { get; set; } = "";
}

View File

@ -1,22 +1,29 @@
namespace kehati.Models.Entity.Master;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
[Table("ms_tumbuhan")]
public class Tumbuhan
{
[Key]
public int MsTumbuhanId { get; set; }
[Column("ms_famili_id")]
public int MsFamiliId { get; set; }
[Column("ms_habitus_id")]
public int MsHabitatId { get; set; }
public string Name { get; set; } = "";
[Column("name")]
public string? Name { get; set; } = "";
[Column("name_ilmiah")]
public string NamaIlmiah { get; set; } = "";
public string? NamaIlmiah { get; set; } = "";
[Column("tanaman_khas_jakarta")]
public bool TanamanKhasJakarta { get; set; }
[Column("status_perlindungan")]
public string StatusPerlindungan { get; set; } = "";
public string? StatusPerlindungan { get; set; } = "";
[Column("iucn")]
public string Iucn { get; set; } = "";
public string? Iucn { get; set; } = "";
[Column("cites")]
public string Cites { get; set; } = "";
public string? Cites { get; set; } = "";
[Column("slug")]
public string? Slug { get; set; } = "";
[Column("image")]
public string? Image { get; set; } = "";
}

View File

@ -1,5 +1,5 @@
using Microsoft.EntityFrameworkCore;
using kehati.Data;
using kehati.Database;
var builder = WebApplication.CreateBuilder(args);

View File

@ -0,0 +1,70 @@
@{
ViewData["Title"] = "Detail Katalog";
}
<div class="mx-auto max-w-6xl px-4 py-12 sm:px-6 lg:px-8">
<a asp-controller="Katalog" asp-action="Index" class="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground">
<i data-lucide="arrow-left" class="h-4 w-4"></i> Katalog
</a>
<div class="mt-6 grid gap-10 lg:grid-cols-5">
<div class="lg:col-span-3">
<div class="overflow-hidden rounded-2xl border border-border bg-muted">
<img src="~/images/@Model.Spesies.Image" class="aspect-[4/3] w-full object-cover" alt="@Model.Spesies.CommonName"/>
</div>
</div>
<div class="lg:col-span-2">
<div class="inline-flex items-center gap-1.5 rounded-full bg-secondary px-2.5 py-1 text-[11px] font-medium text-foreground">
<i data-lucide="leaf" class="h-3 w-3"></i> @Model.Spesies.Type
</div>
<h1 class="mt-4 font-serif text-4xl leading-tight text-foreground sm:text-5xl">
@Model.Spesies.CommonName
</h1>
<p class="mt-1 text-lg italic text-muted-foreground">
@Model.Spesies.ScientificName
</p>
<div class="mt-4">
<span class="rounded-full border border-border px-3 py-1 text-xs">
Status: @Model.Spesies.ConservationStatus
</span>
</div>
<p class="mt-6 text-base leading-relaxed text-foreground">
@Model.Spesies.Description
</p>
<div class="mt-8 rounded-xl border border-border bg-secondary/40 p-5">
<h3 class="text-sm font-semibold text-foreground">
Habitat
</h3>
<p class="mt-2 text-sm leading-relaxed text-muted-foreground">
@Model.Spesies.Habitat
</p>
</div>
</div>
</div>
<div class="mt-16">
<h2 class="font-serif text-2xl text-foreground">
Dapat ditemukan di
</h2>
<div class="mt-5 grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
@foreach(var l in Model.FeaturedLocations)
{
<a asp-controller="lokasi" asp-action="detail" asp-route-slug="@l.Slug" class="group flex items-center gap-4 rounded-xl border border-border bg-card p-3 transition-colors hover:border-primary/40 hover:bg-secondary/60">
<img src="~/images/@l.Image" class="h-14 w-14 rounded-lg object-cover" alt="@l.Name" />
<div class="min-w-0 flex-1">
<div class="truncate font-medium text-foreground">
@l.Name
</div>
<div class="flex items-center gap-1 text-xs text-muted-foreground">
<i data-lucide="map-pin" class="h-3 w-3"></i>
@l.Region
</div>
</div>
</a>
}
</div>
</div>
</div>

View File

@ -0,0 +1,131 @@
@using kehati.Models.View
@{
ViewData["Title"] = "Katalog";
var statusColor = new Dictionary<string, string>
{
{ "Aman", "bg-primary/10 text-primary border-primary/20" },
{ "Rentan", "bg-amber-100 text-amber-800 border-amber-200" },
{ "Terancam", "bg-orange-100 text-orange-800 border-orange-200" },
{ "Kritis", "bg-red-100 text-red-800 border-red-200" },
{ "Dilindungi", "bg-emerald-100 text-emerald-800 border-emerald-200" }
};
}
<div class="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8">
<div class="max-w-2xl">
<div class="text-xs font-medium uppercase tracking-widest text-primary">
Katalog
</div>
<h1 class="mt-3 font-serif text-5xl leading-tight text-foreground">
Flora &amp; Fauna Jakarta
</h1>
<p class="mt-4 text-lg text-muted-foreground">
Telusuri spesies yang terdokumentasi di kawasan konservasi Jakarta.
</p>
</div>
<!-- Filter -->
<form method="get" asp-action="Index">
<div class="mt-10 rounded-2xl border border-border bg-card p-4 sm:p-5">
<div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
<input
type="text"
name="query"
value="@Model.Query"
placeholder="Cari nama atau nama ilmiah..."
class="w-full rounded-lg border border-input bg-background px-3 py-2" />
<select name="type" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all">Semua Jenis</option>
<option value="flora" selected="@(Model.Type=="flora")">Flora</option>
<option value="fauna" selected="@(Model.Type=="fauna")">Fauna</option>
</select>
<select name="status" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all" selected="@(Model.Status == "all")">Semua Status</option>
<option value="Aman" selected="@(Model.Status == "Aman")">Aman</option>
<option value="Rentan" selected="@(Model.Status == "Rentan")">Rentan</option>
<option value="Terancam" selected="@(Model.Status == "Terancam")">Terancam</option>
<option value="Kritis" selected="@(Model.Status == "Kritis")">Kritis</option>
<option value="Dilindungi" selected="@(Model.Status == "Dilindungi")">Dilindungi</option>
</select>
<select name="lokasi" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all">Semua Lokasi</option>
@foreach(LokasiModel loc in Model.FeaturedLocations)
{
<option value="@loc.Slug"
selected="@(Model.lokasi==loc.Slug)">
@loc.Name
</option>
}
</select>
</div>
<div class="mt-4">
<button type="submit" class="rounded-lg bg-primary px-5 py-2 text-primary-foreground">Cari</button>
</div>
</div>
</form>
<div class="mt-6 text-sm text-muted-foreground">
@Model.FeaturedSpesies.Count spesies ditemukan
</div>
@if(Model.FeaturedSpesies.Count == 0)
{
<div class="mt-16 rounded-2xl border border-dashed border-border p-12 text-center">
<p class="text-muted-foreground">
Tidak ada spesies yang cocok dengan filter Anda.
</p>
</div>
}
else
{
<div class="mt-6 grid gap-6 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
@foreach(var s in Model.FeaturedSpesies)
{
<a asp-controller="katalog"
asp-action="detail"
asp-route-slug="@s.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</div>
</div>
</a>
}
</div>
}
</div>

View File

@ -0,0 +1,70 @@
@{
ViewData["Title"] = "Detail Katalog";
}
<div class="mx-auto max-w-6xl px-4 py-12 sm:px-6 lg:px-8">
<a asp-controller="Katalog" asp-action="Index" class="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground">
<i data-lucide="arrow-left" class="h-4 w-4"></i> Katalog
</a>
<div class="mt-6 grid gap-10 lg:grid-cols-5">
<div class="lg:col-span-3">
<div class="overflow-hidden rounded-2xl border border-border bg-muted">
<img src="~/images/@Model.Spesies.Image" class="aspect-[4/3] w-full object-cover" alt="@Model.Spesies.CommonName"/>
</div>
</div>
<div class="lg:col-span-2">
<div class="inline-flex items-center gap-1.5 rounded-full bg-secondary px-2.5 py-1 text-[11px] font-medium text-foreground">
<i data-lucide="leaf" class="h-3 w-3"></i> @Model.Spesies.Type
</div>
<h1 class="mt-4 font-serif text-4xl leading-tight text-foreground sm:text-5xl">
@Model.Spesies.CommonName
</h1>
<p class="mt-1 text-lg italic text-muted-foreground">
@Model.Spesies.ScientificName
</p>
<div class="mt-4">
<span class="rounded-full border border-border px-3 py-1 text-xs">
Status: @Model.Spesies.ConservationStatus
</span>
</div>
<p class="mt-6 text-base leading-relaxed text-foreground">
@Model.Spesies.Description
</p>
<div class="mt-8 rounded-xl border border-border bg-secondary/40 p-5">
<h3 class="text-sm font-semibold text-foreground">
Habitat
</h3>
<p class="mt-2 text-sm leading-relaxed text-muted-foreground">
@Model.Spesies.Habitat
</p>
</div>
</div>
</div>
<div class="mt-16">
<h2 class="font-serif text-2xl text-foreground">
Dapat ditemukan di
</h2>
<div class="mt-5 grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
@foreach(var l in Model.FeaturedLocations)
{
<a asp-controller="lokasi" asp-action="detail" asp-route-slug="@l.Slug" class="group flex items-center gap-4 rounded-xl border border-border bg-card p-3 transition-colors hover:border-primary/40 hover:bg-secondary/60">
<img src="~/images/@l.Image" class="h-14 w-14 rounded-lg object-cover" alt="@l.Name" />
<div class="min-w-0 flex-1">
<div class="truncate font-medium text-foreground">
@l.Name
</div>
<div class="flex items-center gap-1 text-xs text-muted-foreground">
<i data-lucide="map-pin" class="h-3 w-3"></i>
@l.Region
</div>
</div>
</a>
}
</div>
</div>
</div>

View File

@ -0,0 +1,131 @@
@using kehati.Models.View
@{
ViewData["Title"] = "Katalog";
var statusColor = new Dictionary<string, string>
{
{ "Aman", "bg-primary/10 text-primary border-primary/20" },
{ "Rentan", "bg-amber-100 text-amber-800 border-amber-200" },
{ "Terancam", "bg-orange-100 text-orange-800 border-orange-200" },
{ "Kritis", "bg-red-100 text-red-800 border-red-200" },
{ "Dilindungi", "bg-emerald-100 text-emerald-800 border-emerald-200" }
};
}
<div class="mx-auto max-w-7xl px-4 py-16 sm:px-6 lg:px-8">
<div class="max-w-2xl">
<div class="text-xs font-medium uppercase tracking-widest text-primary">
Katalog
</div>
<h1 class="mt-3 font-serif text-5xl leading-tight text-foreground">
Flora &amp; Fauna Jakarta
</h1>
<p class="mt-4 text-lg text-muted-foreground">
Telusuri spesies yang terdokumentasi di kawasan konservasi Jakarta.
</p>
</div>
<!-- Filter -->
<form method="get" asp-action="Index">
<div class="mt-10 rounded-2xl border border-border bg-card p-4 sm:p-5">
<div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
<input
type="text"
name="query"
value="@Model.Query"
placeholder="Cari nama atau nama ilmiah..."
class="w-full rounded-lg border border-input bg-background px-3 py-2" />
<select name="type" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all">Semua Jenis</option>
<option value="flora" selected="@(Model.Type=="flora")">Flora</option>
<option value="fauna" selected="@(Model.Type=="fauna")">Fauna</option>
</select>
<select name="status" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all" selected="@(Model.Status == "all")">Semua Status</option>
<option value="Aman" selected="@(Model.Status == "Aman")">Aman</option>
<option value="Rentan" selected="@(Model.Status == "Rentan")">Rentan</option>
<option value="Terancam" selected="@(Model.Status == "Terancam")">Terancam</option>
<option value="Kritis" selected="@(Model.Status == "Kritis")">Kritis</option>
<option value="Dilindungi" selected="@(Model.Status == "Dilindungi")">Dilindungi</option>
</select>
<select name="lokasi" class="w-full rounded-lg border border-input bg-background px-3 py-2">
<option value="all">Semua Lokasi</option>
@foreach(LokasiModel loc in Model.FeaturedLocations)
{
<option value="@loc.Slug"
selected="@(Model.lokasi==loc.Slug)">
@loc.Name
</option>
}
</select>
</div>
<div class="mt-4">
<button type="submit" class="rounded-lg bg-primary px-5 py-2 text-primary-foreground">Cari</button>
</div>
</div>
</form>
<div class="mt-6 text-sm text-muted-foreground">
@Model.FeaturedSpesies.Count spesies ditemukan
</div>
@if(Model.FeaturedSpesies.Count == 0)
{
<div class="mt-16 rounded-2xl border border-dashed border-border p-12 text-center">
<p class="text-muted-foreground">
Tidak ada spesies yang cocok dengan filter Anda.
</p>
</div>
}
else
{
<div class="mt-6 grid gap-6 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
@foreach(var s in Model.FeaturedSpesies)
{
<a asp-controller="katalog"
asp-action="detail"
asp-route-slug="@s.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</div>
</div>
</a>
}
</div>
}
</div>

View File

@ -7,7 +7,8 @@
{ "Rentan", "bg-amber-100 text-amber-800 border-amber-200" },
{ "Terancam", "bg-orange-100 text-orange-800 border-orange-200" },
{ "Kritis", "bg-red-100 text-red-800 border-red-200" },
{ "Dilindungi", "bg-emerald-100 text-emerald-800 border-emerald-200" }
{ "Dilindungi", "bg-emerald-100 text-emerald-800 border-emerald-200" },
{ "Tidak Dilindungi", "bg-grey-100 text-emerald-800 border-emerald-200" }
};
}
@ -148,107 +149,56 @@
</a>
</div>
<div class="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
@foreach(LokasiModel loc in Model.FeaturedLocations)
@foreach (var loc in ViewBag.lokasiHome)
{
<a asp-controller="lokasi"
asp-action="detail"
asp-route-slug="@loc.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[16/10] overflow-hidden bg-muted">
<img src="~/images/@loc.Image"
alt="@loc.Name"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Gradient -->
<div class="absolute inset-0 bg-gradient-to-t from-black/60 via-black/10 to-transparent"></div>
<!-- Overlay Text -->
<div class="absolute inset-x-0 bottom-0 p-4 text-white">
<div class="flex items-center gap-1.5 text-[11px] uppercase tracking-wider text-white/80">
<i data-lucide="map-pin" class="h-3 w-3"></i>
@loc.Region
</div>
<h3 class="mt-1 font-serif text-xl leading-tight">
@loc.Name
</h3>
</div>
</div>
<!-- Footer Card -->
<div class="flex items-center justify-between p-4 text-sm">
<span class="text-muted-foreground">
@loc.Area
</span>
<div class="flex gap-3 text-foreground">
<span class="flex items-center gap-1">
<i data-lucide="leaf"
class="h-4 w-4 text-primary"></i>
@loc.FloraCount Flora
12 Flora
</span>
<span class="flex items-center gap-1">
<i data-lucide="bird"
class="h-4 w-4 text-primary"></i>
@loc.FaunaCount Fauna
12 Fauna
</span>
</div>
</div>
</a>
}
</div>
</section>
<!-- SPESIES -->
<!-- Flora -->
<section class="mx-auto max-w-7xl px-4 pb-24 sm:px-6 lg:px-8">
<div class="flex items-end justify-between gap-4">
@ -258,65 +208,147 @@
Katalog Pilihan
</div>
<h2 class="mt-3 font-serif text-4xl text-foreground">
Flora & Fauna khas Jakarta
Flora khas Jakarta
</h2>
</div>
<a asp-controller="Katalog"
<a asp-controller="flora"
asp-action="Index"
class="hidden shrink-0 items-center gap-1.5 text-sm font-medium text-primary hover:underline sm:inline-flex">
Semua spesies
Semua flora
<i data-lucide="arrow-right" class="h-4 w-4"></i>
</a>
</div>
<div class="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
@foreach(SpesiesModel s in Model.FeaturedSpesies)
{
<a asp-controller="katalog"
asp-action="detail"
asp-route-slug="@s.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.CommonName"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
@if (ViewBag.tumbuhanHome != null && ViewBag.tumbuhanHome.Count > 0){
@foreach (var s in ViewBag.tumbuhanHome)
{
<a asp-controller="flora"
asp-action="detail"
asp-route-slug="@s.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.Name"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@if(s.Type == "Flora")
{
<i data-lucide="leaf" class="h-3 w-3"></i>
}
else
{
<i data-lucide="bird" class="h-3 w-3"></i>
}
@s.Type
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@* @if(s.Type == "Flora") *@
@* { *@
<i data-lucide="leaf" class="h-3 w-3"></i>
@* } *@
@* else *@
@* { *@
@* <i data-lucide="bird" class="h-3 w-3"></i> *@
@* } *@
@* @s.Cites *@
</div>
</div>
</div>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.CommonName
</h3>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.NamaIlmiah
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.NamaIlmiah
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.StatusPerlindungan)
? statusColor[s.StatusPerlindungan]
: "")">
@s.StatusPerlindungan
</span>
</div>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.ScientificName
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.ConservationStatus)
? statusColor[s.ConservationStatus]
: "")">
@s.ConservationStatus
</span>
</a>
}
}else{
<h4>Data Tidak Ada</h4>
}
</div>
</section>
<!-- Fauna -->
<section class="mx-auto max-w-7xl px-4 pb-24 sm:px-6 lg:px-8">
<div class="flex items-end justify-between gap-4">
<div>
<div class="inline-flex items-center gap-2 text-xs font-medium uppercase tracking-widest text-primary">
<i data-lucide="leaf" class="h-4 w-4"></i>
Katalog Pilihan
</div>
<h2 class="mt-3 font-serif text-4xl text-foreground">
Fauna khas Jakarta
</h2>
</div>
<a asp-controller="fauna"
asp-action="Index"
class="hidden shrink-0 items-center gap-1.5 text-sm font-medium text-primary hover:underline sm:inline-flex">
Semua fauna
<i data-lucide="arrow-right" class="h-4 w-4"></i>
</a>
</div>
<div class="mt-8 grid gap-6 sm:grid-cols-2 lg:grid-cols-4">
@if (ViewBag.faunaHome != null && ViewBag.faunaHome.Count > 0)
{
@foreach (var s in ViewBag.faunaHome)
{
<a asp-controller="fauna"
asp-action="detail"
asp-route-slug="@s.Slug"
class="group block overflow-hidden rounded-2xl border border-border bg-card transition-all hover:-translate-y-1 hover:shadow-lg">
<!-- Image -->
<div class="relative aspect-[4/3] overflow-hidden bg-muted">
<img src="~/images/@s.Image"
alt="@s.Name"
loading="lazy"
asp-append-version="true"
class="h-full w-full object-cover transition-transform duration-500 group-hover:scale-105" />
<!-- Type Badge -->
<div class="absolute left-3 top-3 flex items-center gap-1.5 rounded-full bg-background/90 px-2.5 py-1 text-[11px] font-medium capitalize backdrop-blur">
@* @if(s.Type == "Flora") *@
@* { *@
<i data-lucide="leaf" class="h-3 w-3"></i>
@* } *@
@* else *@
@* { *@
@* <i data-lucide="bird" class="h-3 w-3"></i> *@
@* } *@
@* @s.Cites *@
</div>
</div>
</div>
</a>
<!-- Content -->
<div class="p-4">
<div class="flex items-start justify-between gap-2">
<h3 class="font-serif text-lg leading-tight text-foreground">
@s.NamaIlmiah
</h3>
</div>
<p class="mt-0.5 text-xs italic text-muted-foreground">
@s.NamaIlmiah
</p>
<!-- Status Badge -->
<div class="mt-3">
<span class="inline-flex items-center rounded-md border px-2.5 py-1 text-xs font-medium
@(statusColor.ContainsKey(s.Status)
? statusColor[s.Status]
: "")">
@s.Status
</span>
</div>
</div>
</a>
}
}else{
<h4>Data Tidak Ada</h4>
}
</div>
</section>

View File

@ -68,10 +68,16 @@
Lokasi
</a>
<a asp-controller="katalog"
<a asp-controller="flora"
asp-action="Index"
class="rounded-lg px-3.5 py-2 text-sm font-medium transition-colors hover:bg-secondary hover:text-foreground @(currentPath != null && currentPath.StartsWith("/katalog") ? "bg-secondary text-foreground" : "text-muted-foreground")">
Katalog
class="rounded-lg px-3.5 py-2 text-sm font-medium transition-colors hover:bg-secondary hover:text-foreground @(currentPath != null && currentPath.StartsWith("/flora") ? "bg-secondary text-foreground" : "text-muted-foreground")">
Flora
</a>
<a asp-controller="fauna"
asp-action="Index"
class="rounded-lg px-3.5 py-2 text-sm font-medium transition-colors hover:bg-secondary hover:text-foreground @(currentPath != null && currentPath.StartsWith("/fauna") ? "bg-secondary text-foreground" : "text-muted-foreground")">
Fauna
</a>
<a asp-controller="map"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,12 +8,317 @@
".NETCoreApp,Version=v9.0": {
"kehati/1.0.0": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Design": "9.0.0",
"Npgsql.EntityFrameworkCore.PostgreSQL": "9.0.4"
},
"runtime": {
"kehati.dll": {}
}
},
"Humanizer.Core/2.14.1": {
"runtime": {
"lib/net6.0/Humanizer.dll": {
"assemblyVersion": "2.14.0.0",
"fileVersion": "2.14.1.48190"
}
}
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"runtime": {
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Build.Framework/17.8.3": {},
"Microsoft.Build.Locator/1.7.8": {
"runtime": {
"lib/net6.0/Microsoft.Build.Locator.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.7.8.28074"
}
}
},
"Microsoft.CodeAnalysis.Analyzers/3.3.4": {},
"Microsoft.CodeAnalysis.Common/4.8.0": {
"dependencies": {
"Microsoft.CodeAnalysis.Analyzers": "3.3.4",
"System.Collections.Immutable": "7.0.0",
"System.Reflection.Metadata": "7.0.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
}
},
"resources": {
"lib/net7.0/cs/Microsoft.CodeAnalysis.resources.dll": {
"locale": "cs"
},
"lib/net7.0/de/Microsoft.CodeAnalysis.resources.dll": {
"locale": "de"
},
"lib/net7.0/es/Microsoft.CodeAnalysis.resources.dll": {
"locale": "es"
},
"lib/net7.0/fr/Microsoft.CodeAnalysis.resources.dll": {
"locale": "fr"
},
"lib/net7.0/it/Microsoft.CodeAnalysis.resources.dll": {
"locale": "it"
},
"lib/net7.0/ja/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ja"
},
"lib/net7.0/ko/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ko"
},
"lib/net7.0/pl/Microsoft.CodeAnalysis.resources.dll": {
"locale": "pl"
},
"lib/net7.0/pt-BR/Microsoft.CodeAnalysis.resources.dll": {
"locale": "pt-BR"
},
"lib/net7.0/ru/Microsoft.CodeAnalysis.resources.dll": {
"locale": "ru"
},
"lib/net7.0/tr/Microsoft.CodeAnalysis.resources.dll": {
"locale": "tr"
},
"lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.resources.dll": {
"locale": "zh-Hans"
},
"lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.CSharp/4.8.0": {
"dependencies": {
"Microsoft.CodeAnalysis.Common": "4.8.0"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.CSharp.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
}
},
"resources": {
"lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "cs"
},
"lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "de"
},
"lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "es"
},
"lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "fr"
},
"lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "it"
},
"lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ja"
},
"lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ko"
},
"lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "pl"
},
"lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "pt-BR"
},
"lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "ru"
},
"lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "tr"
},
"lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "zh-Hans"
},
"lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.CodeAnalysis.CSharp": "4.8.0",
"Microsoft.CodeAnalysis.Common": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
}
},
"resources": {
"lib/net7.0/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "cs"
},
"lib/net7.0/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "de"
},
"lib/net7.0/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "es"
},
"lib/net7.0/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "fr"
},
"lib/net7.0/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "it"
},
"lib/net7.0/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ja"
},
"lib/net7.0/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ko"
},
"lib/net7.0/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "pl"
},
"lib/net7.0/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "pt-BR"
},
"lib/net7.0/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "ru"
},
"lib/net7.0/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "tr"
},
"lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "zh-Hans"
},
"lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.Bcl.AsyncInterfaces": "7.0.0",
"Microsoft.CodeAnalysis.Common": "4.8.0",
"System.Composition": "7.0.0",
"System.IO.Pipelines": "7.0.0",
"System.Threading.Channels": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.Workspaces.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
}
},
"resources": {
"lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "cs"
},
"lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "de"
},
"lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "es"
},
"lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "fr"
},
"lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "it"
},
"lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ja"
},
"lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ko"
},
"lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "pl"
},
"lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "pt-BR"
},
"lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "ru"
},
"lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "tr"
},
"lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "zh-Hans"
},
"lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": {
"dependencies": {
"Microsoft.Build.Framework": "17.8.3",
"Microsoft.CodeAnalysis.Common": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.Common": "4.8.0",
"System.Text.Json": "9.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
},
"lib/net7.0/Microsoft.CodeAnalysis.Workspaces.MSBuild.dll": {
"assemblyVersion": "4.8.0.0",
"fileVersion": "4.800.23.55801"
}
},
"resources": {
"lib/net7.0/cs/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "cs"
},
"lib/net7.0/de/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "de"
},
"lib/net7.0/es/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "es"
},
"lib/net7.0/fr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "fr"
},
"lib/net7.0/it/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "it"
},
"lib/net7.0/ja/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ja"
},
"lib/net7.0/ko/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ko"
},
"lib/net7.0/pl/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "pl"
},
"lib/net7.0/pt-BR/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "pt-BR"
},
"lib/net7.0/ru/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "ru"
},
"lib/net7.0/tr/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "tr"
},
"lib/net7.0/zh-Hans/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "zh-Hans"
},
"lib/net7.0/zh-Hant/Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll": {
"locale": "zh-Hant"
}
}
},
"Microsoft.EntityFrameworkCore/9.0.1": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "9.0.1",
@ -37,6 +342,29 @@
}
},
"Microsoft.EntityFrameworkCore.Analyzers/9.0.1": {},
"Microsoft.EntityFrameworkCore.Design/9.0.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.Build.Framework": "17.8.3",
"Microsoft.Build.Locator": "1.7.8",
"Microsoft.CodeAnalysis.CSharp": "4.8.0",
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.8.0",
"Microsoft.CodeAnalysis.Workspaces.MSBuild": "4.8.0",
"Microsoft.EntityFrameworkCore.Relational": "9.0.1",
"Microsoft.Extensions.Caching.Memory": "9.0.1",
"Microsoft.Extensions.Configuration.Abstractions": "9.0.1",
"Microsoft.Extensions.DependencyModel": "9.0.0",
"Microsoft.Extensions.Logging": "9.0.1",
"Mono.TextTemplating": "3.0.0",
"System.Text.Json": "9.0.0"
},
"runtime": {
"lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.24.52902"
}
}
},
"Microsoft.EntityFrameworkCore.Relational/9.0.1": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "9.0.1",
@ -107,6 +435,14 @@
}
}
},
"Microsoft.Extensions.DependencyModel/9.0.0": {
"runtime": {
"lib/net9.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.24.52809"
}
}
},
"Microsoft.Extensions.Logging/9.0.1": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "9.0.1",
@ -151,6 +487,17 @@
}
}
},
"Mono.TextTemplating/3.0.0": {
"dependencies": {
"System.CodeDom": "6.0.0"
},
"runtime": {
"lib/net6.0/Mono.TextTemplating.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.0.0.1"
}
}
},
"Npgsql/9.0.3": {
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "9.0.1"
@ -174,7 +521,85 @@
"fileVersion": "9.0.4.0"
}
}
}
},
"System.CodeDom/6.0.0": {
"runtime": {
"lib/net6.0/System.CodeDom.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.21.52210"
}
}
},
"System.Collections.Immutable/7.0.0": {},
"System.Composition/7.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "7.0.0",
"System.Composition.Convention": "7.0.0",
"System.Composition.Hosting": "7.0.0",
"System.Composition.Runtime": "7.0.0",
"System.Composition.TypedParts": "7.0.0"
}
},
"System.Composition.AttributedModel/7.0.0": {
"runtime": {
"lib/net7.0/System.Composition.AttributedModel.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Composition.Convention/7.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Composition.Convention.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Composition.Hosting/7.0.0": {
"dependencies": {
"System.Composition.Runtime": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Composition.Hosting.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Composition.Runtime/7.0.0": {
"runtime": {
"lib/net7.0/System.Composition.Runtime.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.Composition.TypedParts/7.0.0": {
"dependencies": {
"System.Composition.AttributedModel": "7.0.0",
"System.Composition.Hosting": "7.0.0",
"System.Composition.Runtime": "7.0.0"
},
"runtime": {
"lib/net7.0/System.Composition.TypedParts.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"System.IO.Pipelines/7.0.0": {},
"System.Reflection.Metadata/7.0.0": {
"dependencies": {
"System.Collections.Immutable": "7.0.0"
}
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {},
"System.Text.Json/9.0.0": {},
"System.Threading.Channels/7.0.0": {}
}
},
"libraries": {
@ -183,6 +608,76 @@
"serviceable": false,
"sha512": ""
},
"Humanizer.Core/2.14.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==",
"path": "humanizer.core/2.14.1",
"hashPath": "humanizer.core.2.14.1.nupkg.sha512"
},
"Microsoft.Bcl.AsyncInterfaces/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3aeMZ1N0lJoSyzqiP03hqemtb1BijhsJADdobn/4nsMJ8V1H+CrpuduUe4hlRdx+ikBQju1VGjMD1GJ3Sk05Eg==",
"path": "microsoft.bcl.asyncinterfaces/7.0.0",
"hashPath": "microsoft.bcl.asyncinterfaces.7.0.0.nupkg.sha512"
},
"Microsoft.Build.Framework/17.8.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NrQZJW8TlKVPx72yltGb8SVz3P5mNRk9fNiD/ao8jRSk48WqIIdCn99q4IjlVmPcruuQ+yLdjNQLL8Rb4c916g==",
"path": "microsoft.build.framework/17.8.3",
"hashPath": "microsoft.build.framework.17.8.3.nupkg.sha512"
},
"Microsoft.Build.Locator/1.7.8": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sPy10x527Ph16S2u0yGME4S6ohBKJ69WfjeGG/bvELYeZVmJdKjxgnlL8cJJJLGV/cZIRqSfB12UDB8ICakOog==",
"path": "microsoft.build.locator/1.7.8",
"hashPath": "microsoft.build.locator.1.7.8.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Analyzers/3.3.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AxkxcPR+rheX0SmvpLVIGLhOUXAKG56a64kV9VQZ4y9gR9ZmPXnqZvHJnmwLSwzrEP6junUF11vuc+aqo5r68g==",
"path": "microsoft.codeanalysis.analyzers/3.3.4",
"hashPath": "microsoft.codeanalysis.analyzers.3.3.4.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Common/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/jR+e/9aT+BApoQJABlVCKnnggGQbvGh7BKq2/wI1LamxC+LbzhcLj4Vj7gXCofl1n4E521YfF9w0WcASGg/KA==",
"path": "microsoft.codeanalysis.common/4.8.0",
"hashPath": "microsoft.codeanalysis.common.4.8.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.CSharp/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-+3+qfdb/aaGD8PZRCrsdobbzGs1m9u119SkkJt8e/mk3xLJz/udLtS2T6nY27OTXxBBw10HzAbC8Z9w08VyP/g==",
"path": "microsoft.codeanalysis.csharp/4.8.0",
"hashPath": "microsoft.codeanalysis.csharp.4.8.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3amm4tq4Lo8/BGvg9p3BJh3S9nKq2wqCXfS7138i69TUpo/bD+XvD0hNurpEBtcNZhi1FyutiomKJqVF39ugYA==",
"path": "microsoft.codeanalysis.csharp.workspaces/4.8.0",
"hashPath": "microsoft.codeanalysis.csharp.workspaces.4.8.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Workspaces.Common/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-LXyV+MJKsKRu3FGJA3OmSk40OUIa/dQCFLOnm5X8MNcujx7hzGu8o+zjXlb/cy5xUdZK2UKYb9YaQ2E8m9QehQ==",
"path": "microsoft.codeanalysis.workspaces.common/4.8.0",
"hashPath": "microsoft.codeanalysis.workspaces.common.4.8.0.nupkg.sha512"
},
"Microsoft.CodeAnalysis.Workspaces.MSBuild/4.8.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IEYreI82QZKklp54yPHxZNG9EKSK6nHEkeuf+0Asie9llgS1gp0V1hw7ODG+QyoB7MuAnNQHmeV1Per/ECpv6A==",
"path": "microsoft.codeanalysis.workspaces.msbuild/4.8.0",
"hashPath": "microsoft.codeanalysis.workspaces.msbuild.4.8.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore/9.0.1": {
"type": "package",
"serviceable": true,
@ -204,6 +699,13 @@
"path": "microsoft.entityframeworkcore.analyzers/9.0.1",
"hashPath": "microsoft.entityframeworkcore.analyzers.9.0.1.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Design/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Pqo8I+yHJ3VQrAoY0hiSncf+5P7gN/RkNilK5e+/K/yKh+yAWxdUAI6t0TG26a9VPlCa9FhyklzyFvRyj3YG9A==",
"path": "microsoft.entityframeworkcore.design/9.0.0",
"hashPath": "microsoft.entityframeworkcore.design.9.0.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Relational/9.0.1": {
"type": "package",
"serviceable": true,
@ -246,6 +748,13 @@
"path": "microsoft.extensions.dependencyinjection.abstractions/9.0.1",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.9.0.1.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-saxr2XzwgDU77LaQfYFXmddEDRUKHF4DaGMZkNB3qjdVSZlax3//dGJagJkKrGMIPNZs2jVFXITyCCR6UHJNdA==",
"path": "microsoft.extensions.dependencymodel/9.0.0",
"hashPath": "microsoft.extensions.dependencymodel.9.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging/9.0.1": {
"type": "package",
"serviceable": true,
@ -274,6 +783,13 @@
"path": "microsoft.extensions.primitives/9.0.1",
"hashPath": "microsoft.extensions.primitives.9.0.1.nupkg.sha512"
},
"Mono.TextTemplating/3.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YqueG52R/Xej4VVbKuRIodjiAhV0HR/XVbLbNrJhCZnzjnSjgMJ/dCdV0akQQxavX6hp/LC6rqLGLcXeQYU7XA==",
"path": "mono.texttemplating/3.0.0",
"hashPath": "mono.texttemplating.3.0.0.nupkg.sha512"
},
"Npgsql/9.0.3": {
"type": "package",
"serviceable": true,
@ -287,6 +803,97 @@
"sha512": "sha512-mw5vcY2IEc7L+IeGrxpp/J5OSnCcjkjAgJYCm/eD52wpZze8zsSifdqV7zXslSMmfJG2iIUGZyo3KuDtEFKwMQ==",
"path": "npgsql.entityframeworkcore.postgresql/9.0.4",
"hashPath": "npgsql.entityframeworkcore.postgresql.9.0.4.nupkg.sha512"
},
"System.CodeDom/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA==",
"path": "system.codedom/6.0.0",
"hashPath": "system.codedom.6.0.0.nupkg.sha512"
},
"System.Collections.Immutable/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==",
"path": "system.collections.immutable/7.0.0",
"hashPath": "system.collections.immutable.7.0.0.nupkg.sha512"
},
"System.Composition/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tRwgcAkDd85O8Aq6zHDANzQaq380cek9lbMg5Qma46u5BZXq/G+XvIYmu+UI+BIIZ9zssXLYrkTykEqxxvhcmg==",
"path": "system.composition/7.0.0",
"hashPath": "system.composition.7.0.0.nupkg.sha512"
},
"System.Composition.AttributedModel/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2QzClqjElKxgI1jK1Jztnq44/8DmSuTSGGahXqQ4TdEV0h9s2KikQZIgcEqVzR7OuWDFPGLHIprBJGQEPr8fAQ==",
"path": "system.composition.attributedmodel/7.0.0",
"hashPath": "system.composition.attributedmodel.7.0.0.nupkg.sha512"
},
"System.Composition.Convention/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IMhTlpCs4HmlD8B+J8/kWfwX7vrBBOs6xyjSTzBlYSs7W4OET4tlkR/Sg9NG8jkdJH9Mymq0qGdYS1VPqRTBnQ==",
"path": "system.composition.convention/7.0.0",
"hashPath": "system.composition.convention.7.0.0.nupkg.sha512"
},
"System.Composition.Hosting/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eB6gwN9S+54jCTBJ5bpwMOVerKeUfGGTYCzz3QgDr1P55Gg/Wb27ShfPIhLMjmZ3MoAKu8uUSv6fcCdYJTN7Bg==",
"path": "system.composition.hosting/7.0.0",
"hashPath": "system.composition.hosting.7.0.0.nupkg.sha512"
},
"System.Composition.Runtime/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-aZJ1Zr5Txe925rbo4742XifEyW0MIni1eiUebmcrP3HwLXZ3IbXUj4MFMUH/RmnJOAQiS401leg/2Sz1MkApDw==",
"path": "system.composition.runtime/7.0.0",
"hashPath": "system.composition.runtime.7.0.0.nupkg.sha512"
},
"System.Composition.TypedParts/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZK0KNPfbtxVceTwh+oHNGUOYV2WNOHReX2AXipuvkURC7s/jPwoWfsu3SnDBDgofqbiWr96geofdQ2erm/KTHg==",
"path": "system.composition.typedparts/7.0.0",
"hashPath": "system.composition.typedparts.7.0.0.nupkg.sha512"
},
"System.IO.Pipelines/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-jRn6JYnNPW6xgQazROBLSfpdoczRw694vO5kKvMcNnpXuolEixUyw6IBuBs2Y2mlSX/LdLvyyWmfXhaI3ND1Yg==",
"path": "system.io.pipelines/7.0.0",
"hashPath": "system.io.pipelines.7.0.0.nupkg.sha512"
},
"System.Reflection.Metadata/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-MclTG61lsD9sYdpNz9xsKBzjsmsfCtcMZYXz/IUr2zlhaTaABonlr1ESeompTgM+Xk+IwtGYU7/voh3YWB/fWw==",
"path": "system.reflection.metadata/7.0.0",
"hashPath": "system.reflection.metadata.7.0.0.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
"path": "system.runtime.compilerservices.unsafe/6.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
},
"System.Text.Json/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-js7+qAu/9mQvnhA4EfGMZNEzXtJCDxgkgj8ohuxq/Qxv+R56G+ljefhiJHOxTNiw54q8vmABCWUwkMulNdlZ4A==",
"path": "system.text.json/9.0.0",
"hashPath": "system.text.json.9.0.0.nupkg.sha512"
},
"System.Threading.Channels/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-qmeeYNROMsONF6ndEZcIQ+VxR4Q/TX/7uIVLJqtwIWL7dDWeh0l1UIqgo4wYyjG//5lUNhwkLDSFl+pAWO6oiA==",
"path": "system.threading.channels/7.0.0",
"hashPath": "system.threading.channels.7.0.0.nupkg.sha512"
}
}
}

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More