diff --git a/console_ui/Program.cs b/console_ui/Program.cs
new file mode 100644
index 0000000..3751555
--- /dev/null
+++ b/console_ui/Program.cs
@@ -0,0 +1,2 @@
+// See https://aka.ms/new-console-template for more information
+Console.WriteLine("Hello, World!");
diff --git a/console_ui/console_ui.csproj b/console_ui/console_ui.csproj
new file mode 100644
index 0000000..883c822
--- /dev/null
+++ b/console_ui/console_ui.csproj
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/data/DAO/Group.cs b/data/DAO/Group.cs
new file mode 100644
index 0000000..1a778f6
--- /dev/null
+++ b/data/DAO/Group.cs
@@ -0,0 +1,9 @@
+namespace data.DAO;
+
+public class GroupDAO
+{
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public virtual IEnumerable Users { get; set; }
+
+}
diff --git a/data/DAO/User.cs b/data/DAO/User.cs
new file mode 100644
index 0000000..385afa6
--- /dev/null
+++ b/data/DAO/User.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace data.DAO
+{
+ public class UserDAO
+ {
+ public Guid Guid { get; set; }
+ public string Name { get; set; }
+ public virtual GroupDAO Group { get; set; }
+
+ }
+}
diff --git a/data/Migrations/20241111142428_InitialCreate.Designer.cs b/data/Migrations/20241111142428_InitialCreate.Designer.cs
new file mode 100644
index 0000000..06dac4b
--- /dev/null
+++ b/data/Migrations/20241111142428_InitialCreate.Designer.cs
@@ -0,0 +1,83 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using data;
+
+#nullable disable
+
+namespace data.Migrations
+{
+ [DbContext(typeof(RemoteDatabaseContext))]
+ [Migration("20241111142428_InitialCreate")]
+ partial class InitialCreate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("data.DAO.GroupDAO", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("groups");
+ });
+
+ modelBuilder.Entity("data.DAO.UserDAO", b =>
+ {
+ b.Property("Guid")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("GroupId")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Guid");
+
+ b.HasIndex("GroupId");
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("data.DAO.UserDAO", b =>
+ {
+ b.HasOne("data.DAO.GroupDAO", "Group")
+ .WithMany("Users")
+ .HasForeignKey("GroupId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Group");
+ });
+
+ modelBuilder.Entity("data.DAO.GroupDAO", b =>
+ {
+ b.Navigation("Users");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/data/Migrations/20241111142428_InitialCreate.cs b/data/Migrations/20241111142428_InitialCreate.cs
new file mode 100644
index 0000000..d14854e
--- /dev/null
+++ b/data/Migrations/20241111142428_InitialCreate.cs
@@ -0,0 +1,63 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace data.Migrations
+{
+ ///
+ public partial class InitialCreate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "groups",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ Name = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_groups", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "users",
+ columns: table => new
+ {
+ Guid = table.Column(type: "uuid", nullable: false),
+ Name = table.Column(type: "text", nullable: false),
+ GroupId = table.Column(type: "integer", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_users", x => x.Guid);
+ table.ForeignKey(
+ name: "FK_users_groups_GroupId",
+ column: x => x.GroupId,
+ principalTable: "groups",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_users_GroupId",
+ table: "users",
+ column: "GroupId");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "users");
+
+ migrationBuilder.DropTable(
+ name: "groups");
+ }
+ }
+}
diff --git a/data/Migrations/RemoteDatabaseContextModelSnapshot.cs b/data/Migrations/RemoteDatabaseContextModelSnapshot.cs
new file mode 100644
index 0000000..c5848d9
--- /dev/null
+++ b/data/Migrations/RemoteDatabaseContextModelSnapshot.cs
@@ -0,0 +1,80 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using data;
+
+#nullable disable
+
+namespace data.Migrations
+{
+ [DbContext(typeof(RemoteDatabaseContext))]
+ partial class RemoteDatabaseContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.10")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("data.DAO.GroupDAO", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("groups");
+ });
+
+ modelBuilder.Entity("data.DAO.UserDAO", b =>
+ {
+ b.Property("Guid")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("GroupId")
+ .HasColumnType("integer");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Guid");
+
+ b.HasIndex("GroupId");
+
+ b.ToTable("users");
+ });
+
+ modelBuilder.Entity("data.DAO.UserDAO", b =>
+ {
+ b.HasOne("data.DAO.GroupDAO", "Group")
+ .WithMany("Users")
+ .HasForeignKey("GroupId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Group");
+ });
+
+ modelBuilder.Entity("data.DAO.GroupDAO", b =>
+ {
+ b.Navigation("Users");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/data/RemoteDatabaseContext.cs b/data/RemoteDatabaseContext.cs
new file mode 100644
index 0000000..1347e32
--- /dev/null
+++ b/data/RemoteDatabaseContext.cs
@@ -0,0 +1,32 @@
+using data.DAO;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace data
+{
+ public class RemoteDatabaseContext: DbContext
+ {
+ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
+ {
+ optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Password=123;Username=postgres;Database=presence");
+ }
+
+ DbSet groups { get;set;}
+
+ DbSet users { get;set;}
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ modelBuilder.Entity().HasKey(it => it.Guid);
+ modelBuilder.Entity().HasKey(it => it.Id);
+
+ modelBuilder.Entity().Property(it => it.Guid).ValueGeneratedOnAdd();
+ modelBuilder.Entity().Property(it => it.Id).ValueGeneratedOnAdd();
+ }
+
+ }
+}
diff --git a/data/data.csproj b/data/data.csproj
new file mode 100644
index 0000000..2b2ccad
--- /dev/null
+++ b/data/data.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
diff --git a/domain/Class1.cs b/domain/Class1.cs
new file mode 100644
index 0000000..21c3090
--- /dev/null
+++ b/domain/Class1.cs
@@ -0,0 +1,6 @@
+namespace domain;
+
+public class Class1
+{
+
+}
diff --git a/domain/domain.csproj b/domain/domain.csproj
new file mode 100644
index 0000000..8d40d4a
--- /dev/null
+++ b/domain/domain.csproj
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
diff --git a/presnce.sln b/presnce.sln
new file mode 100644
index 0000000..5c98574
--- /dev/null
+++ b/presnce.sln
@@ -0,0 +1,40 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "data", "data\data.csproj", "{FFE39EC0-DDC4-4670-A991-075ADF2B4C95}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "domain", "domain\domain.csproj", "{633650E7-0BAB-49D7-B72A-64A5D5A22E26}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ui", "ui\ui.csproj", "{2CDB8D72-14C6-47D8-9DA0-852E72FE1663}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "console_ui", "console_ui\console_ui.csproj", "{1DEBFFB8-8F9B-4E2D-881C-A65AE0A206C3}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {FFE39EC0-DDC4-4670-A991-075ADF2B4C95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FFE39EC0-DDC4-4670-A991-075ADF2B4C95}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFE39EC0-DDC4-4670-A991-075ADF2B4C95}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FFE39EC0-DDC4-4670-A991-075ADF2B4C95}.Release|Any CPU.Build.0 = Release|Any CPU
+ {633650E7-0BAB-49D7-B72A-64A5D5A22E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {633650E7-0BAB-49D7-B72A-64A5D5A22E26}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {633650E7-0BAB-49D7-B72A-64A5D5A22E26}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {633650E7-0BAB-49D7-B72A-64A5D5A22E26}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CDB8D72-14C6-47D8-9DA0-852E72FE1663}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2CDB8D72-14C6-47D8-9DA0-852E72FE1663}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CDB8D72-14C6-47D8-9DA0-852E72FE1663}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2CDB8D72-14C6-47D8-9DA0-852E72FE1663}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1DEBFFB8-8F9B-4E2D-881C-A65AE0A206C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1DEBFFB8-8F9B-4E2D-881C-A65AE0A206C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1DEBFFB8-8F9B-4E2D-881C-A65AE0A206C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1DEBFFB8-8F9B-4E2D-881C-A65AE0A206C3}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/ui/Class1.cs b/ui/Class1.cs
new file mode 100644
index 0000000..de5442b
--- /dev/null
+++ b/ui/Class1.cs
@@ -0,0 +1,6 @@
+namespace ui;
+
+public class Class1
+{
+
+}
diff --git a/ui/ui.csproj b/ui/ui.csproj
new file mode 100644
index 0000000..dcf787d
--- /dev/null
+++ b/ui/ui.csproj
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+ net8.0
+ enable
+ enable
+
+
+