diff --git a/data/createdatabase.sql b/data/createdatabase.sql index 41b5a17..3d75c63 100644 --- a/data/createdatabase.sql +++ b/data/createdatabase.sql @@ -1,115 +1,115 @@ USE [master] GO -/****** Object: Database [sql101.firstname.lastname] Script Date: 1/21/2019 9:11:50 PM ******/ -CREATE DATABASE [sql101.firstname.lastname] +/****** Object: Database [sql101.mbongiseni.ncube] Script Date: 1/21/2019 9:11:50 PM ******/ +CREATE DATABASE [sql101.mbongiseni.ncube] CONTAINMENT = NONE ON PRIMARY -( NAME = N'sql101.firstname.lastname', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\sql101.firstname.lastname.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ) +( NAME = N'sql101.mbongiseni.ncube', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\sql101.mbongiseni.ncube.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ) LOG ON -( NAME = N'sql101.firstname.lastname_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\sql101.firstname.lastname_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ) +( NAME = N'sql101.mbongiseni.ncube_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\sql101.mbongiseni.ncube_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB ) GO -ALTER DATABASE [sql101.firstname.lastname] SET COMPATIBILITY_LEVEL = 130 +ALTER DATABASE [sql101.mbongiseni.ncube] SET COMPATIBILITY_LEVEL = 130 GO IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) begin -EXEC [sql101.firstname.lastname].[dbo].[sp_fulltext_database] @action = 'enable' +EXEC [sql101.mbongiseni.ncube].[dbo].[sp_fulltext_database] @action = 'enable' end GO -ALTER DATABASE [sql101.firstname.lastname] SET ANSI_NULL_DEFAULT OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ANSI_NULL_DEFAULT OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET ANSI_NULLS OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ANSI_NULLS OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET ANSI_PADDING OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ANSI_PADDING OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET ANSI_WARNINGS OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ANSI_WARNINGS OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET ARITHABORT OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ARITHABORT OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET AUTO_CLOSE OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET AUTO_CLOSE OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET AUTO_SHRINK OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET AUTO_SHRINK OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET AUTO_UPDATE_STATISTICS ON +ALTER DATABASE [sql101.mbongiseni.ncube] SET AUTO_UPDATE_STATISTICS ON GO -ALTER DATABASE [sql101.firstname.lastname] SET CURSOR_CLOSE_ON_COMMIT OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET CURSOR_CLOSE_ON_COMMIT OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET CURSOR_DEFAULT GLOBAL +ALTER DATABASE [sql101.mbongiseni.ncube] SET CURSOR_DEFAULT GLOBAL GO -ALTER DATABASE [sql101.firstname.lastname] SET CONCAT_NULL_YIELDS_NULL OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET CONCAT_NULL_YIELDS_NULL OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET NUMERIC_ROUNDABORT OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET NUMERIC_ROUNDABORT OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET QUOTED_IDENTIFIER OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET QUOTED_IDENTIFIER OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET RECURSIVE_TRIGGERS OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET RECURSIVE_TRIGGERS OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET DISABLE_BROKER +ALTER DATABASE [sql101.mbongiseni.ncube] SET DISABLE_BROKER GO -ALTER DATABASE [sql101.firstname.lastname] SET AUTO_UPDATE_STATISTICS_ASYNC OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET AUTO_UPDATE_STATISTICS_ASYNC OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET DATE_CORRELATION_OPTIMIZATION OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET DATE_CORRELATION_OPTIMIZATION OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET TRUSTWORTHY OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET TRUSTWORTHY OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET ALLOW_SNAPSHOT_ISOLATION OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET ALLOW_SNAPSHOT_ISOLATION OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET PARAMETERIZATION SIMPLE +ALTER DATABASE [sql101.mbongiseni.ncube] SET PARAMETERIZATION SIMPLE GO -ALTER DATABASE [sql101.firstname.lastname] SET READ_COMMITTED_SNAPSHOT OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET READ_COMMITTED_SNAPSHOT OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET HONOR_BROKER_PRIORITY OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET HONOR_BROKER_PRIORITY OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET RECOVERY FULL +ALTER DATABASE [sql101.mbongiseni.ncube] SET RECOVERY FULL GO -ALTER DATABASE [sql101.firstname.lastname] SET MULTI_USER +ALTER DATABASE [sql101.mbongiseni.ncube] SET MULTI_USER GO -ALTER DATABASE [sql101.firstname.lastname] SET PAGE_VERIFY CHECKSUM +ALTER DATABASE [sql101.mbongiseni.ncube] SET PAGE_VERIFY CHECKSUM GO -ALTER DATABASE [sql101.firstname.lastname] SET DB_CHAINING OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET DB_CHAINING OFF GO -ALTER DATABASE [sql101.firstname.lastname] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) +ALTER DATABASE [sql101.mbongiseni.ncube] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) GO -ALTER DATABASE [sql101.firstname.lastname] SET TARGET_RECOVERY_TIME = 60 SECONDS +ALTER DATABASE [sql101.mbongiseni.ncube] SET TARGET_RECOVERY_TIME = 60 SECONDS GO -ALTER DATABASE [sql101.firstname.lastname] SET DELAYED_DURABILITY = DISABLED +ALTER DATABASE [sql101.mbongiseni.ncube] SET DELAYED_DURABILITY = DISABLED GO -ALTER DATABASE [sql101.firstname.lastname] SET QUERY_STORE = OFF +ALTER DATABASE [sql101.mbongiseni.ncube] SET QUERY_STORE = OFF GO -USE [sql101.firstname.lastname] +USE [sql101.mbongiseni.ncube] GO ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF; @@ -124,7 +124,7 @@ GO ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF; GO -ALTER DATABASE [sql101.firstname.lastname] SET READ_WRITE +ALTER DATABASE [sql101.mbongiseni.ncube] SET READ_WRITE GO diff --git a/data/createuser.sql b/data/createuser.sql index bcf3038..b820adb 100644 --- a/data/createuser.sql +++ b/data/createuser.sql @@ -1,18 +1,18 @@ USE [master] GO -CREATE LOGIN [firstnamelastname] WITH PASSWORD=N'rabbit123!@#' MUST_CHANGE, DEFAULT_DATABASE=[sql101.firstname.lastname], CHECK_EXPIRATION=ON, CHECK_POLICY=ON +CREATE LOGIN [mbongisenincube] WITH PASSWORD=N'rabbit123!@#' MUST_CHANGE, DEFAULT_DATABASE=[sql101.mbongiseni.ncube], CHECK_EXPIRATION=ON, CHECK_POLICY=ON GO -use [sql101.firstname.lastname] +use [sql101.mbongiseni.ncube] GO use [master] GO -USE [sql101.firstname.lastname] +USE [sql101.mbongiseni.ncube] GO -CREATE USER [firstnamelastname] FOR LOGIN [firstnamelastname] +CREATE USER [mbongisenincube] FOR LOGIN [mbongisenincube] GO -USE [sql101.firstname.lastname] +USE [sql101.mbongiseni.ncube] GO -ALTER ROLE [db_owner] ADD MEMBER [firstnamelastname] +ALTER ROLE [db_owner] ADD MEMBER [mbongisenincube] GO diff --git a/redis-5.0.3.tar.gz b/redis-5.0.3.tar.gz new file mode 100644 index 0000000..ec1e575 Binary files /dev/null and b/redis-5.0.3.tar.gz differ diff --git a/src/MyTimesheet/MyTimesheet/CacheSecrets.config b/src/MyTimesheet/MyTimesheet/CacheSecrets.config new file mode 100644 index 0000000..fbacd61 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/CacheSecrets.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/MyTimesheet/MyTimesheet/Controllers/TimesheetController.cs b/src/MyTimesheet/MyTimesheet/Controllers/TimesheetController.cs index b2f5a7c..a764a40 100644 --- a/src/MyTimesheet/MyTimesheet/Controllers/TimesheetController.cs +++ b/src/MyTimesheet/MyTimesheet/Controllers/TimesheetController.cs @@ -6,6 +6,11 @@ using System.Linq; using System.Threading.Tasks; +using System.Configuration; +using StackExchange.Redis; +using Microsoft.Extensions.Configuration; +using Microsoft.IdentityModel.Protocols; + namespace MyTimesheet.Controllers { [Route("api/[controller]")] @@ -13,9 +18,13 @@ namespace MyTimesheet.Controllers public class TimesheetController : ControllerBase { private readonly TimesheetContext _db; - public TimesheetController(TimesheetContext context) + readonly IConfiguration _config; + + public TimesheetController(TimesheetContext context,IConfiguration config) { _db = context; + _config=config; + } // GET api/values @@ -34,10 +43,30 @@ public async Task> Get(int id) // POST api/values [HttpPost] - public async Task Post([FromBody] TimesheetEntry value) + public async Task Post([FromBody] TimesheetEntry value) { + Employee employee=new Employee(); + await _db.Entries.AddAsync(value); await _db.SaveChangesAsync(); + + var lazyConnection = new Lazy(() => + { + string cacheConnection = _config.GetValue("CacheConnection").ToString(); + return ConnectionMultiplexer.Connect(cacheConnection); + }); + + + + IDatabase cache = lazyConnection.Value.GetDatabase(); + await cache.StringSetAsync($"{employee.Name}-{employee.Surname}", $"{employee.Name}-{employee.Surname}" ); + var cacheitem = await cache.StringGetAsync($"{employee.Name}-{employee.Surname}"); + lazyConnection.Value.Dispose(); + + + + return cacheitem; + } // PUT api/values/5 @@ -57,5 +86,8 @@ public async Task Delete(int id) _db.Entries.Remove(entry); await _db.SaveChangesAsync(); } + + + } } diff --git a/src/MyTimesheet/MyTimesheet/Controllers/ValuesController.cs b/src/MyTimesheet/MyTimesheet/Controllers/ValuesController.cs index 5f69525..83509a4 100644 --- a/src/MyTimesheet/MyTimesheet/Controllers/ValuesController.cs +++ b/src/MyTimesheet/MyTimesheet/Controllers/ValuesController.cs @@ -26,8 +26,9 @@ public ActionResult Get(int id) // POST api/values [HttpPost] - public void Post([FromBody] string value) + public ActionResult Post([FromBody] string value) { + return value; } // PUT api/values/5 diff --git a/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.Designer.cs b/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.Designer.cs new file mode 100644 index 0000000..9801dfe --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.Designer.cs @@ -0,0 +1,57 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyTimesheet.Models; + +namespace MyTimesheet.Migrations +{ + [DbContext(typeof(TimesheetContext))] + [Migration("20190122084232_InitialCreate")] + partial class InitialCreate + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.1-servicing-10028") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("MyTimesheet.Models.TimesheetEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Billable"); + + b.Property("Client"); + + b.Property("Date"); + + b.Property("Description"); + + b.Property("Duration"); + + b.Property("Name"); + + b.Property("Project"); + + b.Property("Surname"); + + b.Property("TimeEnd"); + + b.Property("TimeStart"); + + b.HasKey("Id"); + + b.ToTable("Entries"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.cs b/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.cs new file mode 100644 index 0000000..092ae5b --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Migrations/20190122084232_InitialCreate.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MyTimesheet.Migrations +{ + public partial class InitialCreate : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Entries", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), + Name = table.Column(nullable: true), + Surname = table.Column(nullable: true), + Client = table.Column(nullable: true), + Project = table.Column(nullable: true), + Date = table.Column(nullable: false), + TimeStart = table.Column(nullable: false), + TimeEnd = table.Column(nullable: false), + Duration = table.Column(nullable: false), + Description = table.Column(nullable: true), + Billable = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Entries", x => x.Id); + }); + + } + + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Entries"); + } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.Designer.cs b/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.Designer.cs new file mode 100644 index 0000000..8b80b88 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.Designer.cs @@ -0,0 +1,120 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyTimesheet.Models; + +namespace MyTimesheet.Migrations +{ + [DbContext(typeof(TimesheetContext))] + [Migration("20190126144628_newmigrations")] + partial class newmigrations + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.1-servicing-10028") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("MyTimesheet.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("client"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("MyTimesheet.Models.Employee", b => + { + b.Property("eId") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Name"); + + b.Property("Surname"); + + b.HasKey("eId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("MyTimesheet.Models.TimesheetEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Billable"); + + b.Property("Date"); + + b.Property("Description"); + + b.Property("Duration"); + + b.Property("TimeEnd"); + + b.Property("TimeStart"); + + b.Property("nameeId"); + + b.Property("projectId"); + + b.HasKey("Id"); + + b.HasIndex("nameeId"); + + b.HasIndex("projectId"); + + b.ToTable("Entries"); + }); + + modelBuilder.Entity("MyTimesheet.Models.project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Project"); + + b.Property("clientId"); + + b.HasKey("Id"); + + b.HasIndex("clientId"); + + b.ToTable("projects"); + }); + + modelBuilder.Entity("MyTimesheet.Models.TimesheetEntry", b => + { + b.HasOne("MyTimesheet.Models.Employee", "name") + .WithMany() + .HasForeignKey("nameeId"); + + b.HasOne("MyTimesheet.Models.project", "project") + .WithMany() + .HasForeignKey("projectId"); + }); + + modelBuilder.Entity("MyTimesheet.Models.project", b => + { + b.HasOne("MyTimesheet.Models.Client", "client") + .WithMany() + .HasForeignKey("clientId"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.cs b/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.cs new file mode 100644 index 0000000..a6cf8c6 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Migrations/20190126144628_newmigrations.cs @@ -0,0 +1,171 @@ +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace MyTimesheet.Migrations +{ + public partial class newmigrations : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Client", + table: "Entries"); + + migrationBuilder.DropColumn( + name: "Name", + table: "Entries"); + + migrationBuilder.DropColumn( + name: "Project", + table: "Entries"); + + migrationBuilder.DropColumn( + name: "Surname", + table: "Entries"); + + migrationBuilder.AddColumn( + name: "nameeId", + table: "Entries", + nullable: true); + + migrationBuilder.AddColumn( + name: "projectId", + table: "Entries", + nullable: true); + + migrationBuilder.CreateTable( + name: "Clients", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), + client = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Clients", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Employees", + columns: table => new + { + eId = table.Column(nullable: false) + .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), + Name = table.Column(nullable: true), + Surname = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Employees", x => x.eId); + }); + + migrationBuilder.CreateTable( + name: "projects", + columns: table => new + { + Id = table.Column(nullable: false) + .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), + clientId = table.Column(nullable: true), + Project = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_projects", x => x.Id); + table.ForeignKey( + name: "FK_projects_Clients_clientId", + column: x => x.clientId, + principalTable: "Clients", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_Entries_nameeId", + table: "Entries", + column: "nameeId"); + + migrationBuilder.CreateIndex( + name: "IX_Entries_projectId", + table: "Entries", + column: "projectId"); + + migrationBuilder.CreateIndex( + name: "IX_projects_clientId", + table: "projects", + column: "clientId"); + + migrationBuilder.AddForeignKey( + name: "FK_Entries_Employees_nameeId", + table: "Entries", + column: "nameeId", + principalTable: "Employees", + principalColumn: "eId", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Entries_projects_projectId", + table: "Entries", + column: "projectId", + principalTable: "projects", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Entries_Employees_nameeId", + table: "Entries"); + + migrationBuilder.DropForeignKey( + name: "FK_Entries_projects_projectId", + table: "Entries"); + + migrationBuilder.DropTable( + name: "Employees"); + + migrationBuilder.DropTable( + name: "projects"); + + migrationBuilder.DropTable( + name: "Clients"); + + migrationBuilder.DropIndex( + name: "IX_Entries_nameeId", + table: "Entries"); + + migrationBuilder.DropIndex( + name: "IX_Entries_projectId", + table: "Entries"); + + migrationBuilder.DropColumn( + name: "nameeId", + table: "Entries"); + + migrationBuilder.DropColumn( + name: "projectId", + table: "Entries"); + + migrationBuilder.AddColumn( + name: "Client", + table: "Entries", + nullable: true); + + migrationBuilder.AddColumn( + name: "Name", + table: "Entries", + nullable: true); + + migrationBuilder.AddColumn( + name: "Project", + table: "Entries", + nullable: true); + + migrationBuilder.AddColumn( + name: "Surname", + table: "Entries", + nullable: true); + } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Migrations/TimesheetContextModelSnapshot.cs b/src/MyTimesheet/MyTimesheet/Migrations/TimesheetContextModelSnapshot.cs new file mode 100644 index 0000000..62879c4 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Migrations/TimesheetContextModelSnapshot.cs @@ -0,0 +1,118 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MyTimesheet.Models; + +namespace MyTimesheet.Migrations +{ + [DbContext(typeof(TimesheetContext))] + partial class TimesheetContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.1-servicing-10028") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("MyTimesheet.Models.Client", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("client"); + + b.HasKey("Id"); + + b.ToTable("Clients"); + }); + + modelBuilder.Entity("MyTimesheet.Models.Employee", b => + { + b.Property("eId") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Name"); + + b.Property("Surname"); + + b.HasKey("eId"); + + b.ToTable("Employees"); + }); + + modelBuilder.Entity("MyTimesheet.Models.TimesheetEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Billable"); + + b.Property("Date"); + + b.Property("Description"); + + b.Property("Duration"); + + b.Property("TimeEnd"); + + b.Property("TimeStart"); + + b.Property("nameeId"); + + b.Property("projectId"); + + b.HasKey("Id"); + + b.HasIndex("nameeId"); + + b.HasIndex("projectId"); + + b.ToTable("Entries"); + }); + + modelBuilder.Entity("MyTimesheet.Models.project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Project"); + + b.Property("clientId"); + + b.HasKey("Id"); + + b.HasIndex("clientId"); + + b.ToTable("projects"); + }); + + modelBuilder.Entity("MyTimesheet.Models.TimesheetEntry", b => + { + b.HasOne("MyTimesheet.Models.Employee", "name") + .WithMany() + .HasForeignKey("nameeId"); + + b.HasOne("MyTimesheet.Models.project", "project") + .WithMany() + .HasForeignKey("projectId"); + }); + + modelBuilder.Entity("MyTimesheet.Models.project", b => + { + b.HasOne("MyTimesheet.Models.Client", "client") + .WithMany() + .HasForeignKey("clientId"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Models/Client.cs b/src/MyTimesheet/MyTimesheet/Models/Client.cs new file mode 100644 index 0000000..0b0f261 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Models/Client.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; + +namespace MyTimesheet.Models +{ + public class Client + { + [Key] + public int Id { get; set; } + public string client { get; set; } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Models/Employee.cs b/src/MyTimesheet/MyTimesheet/Models/Employee.cs new file mode 100644 index 0000000..c22a6bb --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Models/Employee.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; + +namespace MyTimesheet.Models +{ + public class Employee + { [Key] + public int eId { get; set; } + public string Name { get; set; } + public string Surname { get; set; } + } +} diff --git a/src/MyTimesheet/MyTimesheet/Models/TimesheetContext.cs b/src/MyTimesheet/MyTimesheet/Models/TimesheetContext.cs index 5bf7e22..6328a9e 100644 --- a/src/MyTimesheet/MyTimesheet/Models/TimesheetContext.cs +++ b/src/MyTimesheet/MyTimesheet/Models/TimesheetContext.cs @@ -13,6 +13,9 @@ public TimesheetContext(DbContextOptions options) { } public DbSet Entries { get; set; } + public DbSet Clients {get; set; } + public DbSet projects { get; set; } + public DbSet Employees { get; set; } } } diff --git a/src/MyTimesheet/MyTimesheet/Models/TimesheetEntry.cs b/src/MyTimesheet/MyTimesheet/Models/TimesheetEntry.cs index 8c65667..e212909 100644 --- a/src/MyTimesheet/MyTimesheet/Models/TimesheetEntry.cs +++ b/src/MyTimesheet/MyTimesheet/Models/TimesheetEntry.cs @@ -8,22 +8,22 @@ namespace MyTimesheet.Models public class TimesheetEntry { /* - Name | Surname | Client | Project | Date | Time Started | Time ended | Duration | Description | Billable - --- | --- | --- | --- | --- | --- | --- | --- | --- | --- - John | Doe | Client X | Website | 2019-01-22 | 09:00 | 11:00 | 120 | I was rocking HTML5 | YES - John | Doe | Client X | API | 2019-01-22 | 13:00 | 17:00 | 240 | Grafting on golang api | YES + Name | Surname | Client | Project | Date | Time Started | Time ended | Duration | Description | Billable + --- | --- | --- | --- | --- | --- | --- | --- | --- | --- + John | Doe | Client X | Website | 2019-01-22 | 09:00 | 11:00 | 120 | I was rocking HTML5 | YES + John | Doe | Client X | API | 2019-01-22 | 13:00 | 17:00 | 240 | Grafting on golang api | YES */ public int Id { get; set; } - public string Name { get; set; } - public string Surname { get; set; } - public string Client { get; set; } - public string Project { get; set; } + public Employee name { get; set; } + public project project { get; set; } + public DateTime Date { get; set; } public DateTime TimeStart { get; set; } public DateTime TimeEnd { get; set; } public int Duration { get; set; } public string Description { get; set; } public bool Billable { get; set; } + public object Employee { get; internal set; } } } diff --git a/src/MyTimesheet/MyTimesheet/Models/project.cs b/src/MyTimesheet/MyTimesheet/Models/project.cs new file mode 100644 index 0000000..98ad278 --- /dev/null +++ b/src/MyTimesheet/MyTimesheet/Models/project.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Threading.Tasks; + +namespace MyTimesheet.Models +{ + public class project + { + [Key] + public int Id { get; set; } + public Client client { get; set; } + + public string Project { get; set; } + + } +} diff --git a/src/MyTimesheet/MyTimesheet/Startup.cs b/src/MyTimesheet/MyTimesheet/Startup.cs index e81072d..050727f 100644 --- a/src/MyTimesheet/MyTimesheet/Startup.cs +++ b/src/MyTimesheet/MyTimesheet/Startup.cs @@ -35,7 +35,9 @@ public void ConfigureServices(IServiceCollection services) c.SwaggerDoc("v1", new Info { Title = "My Timesheet API", Version = "v1" }); }); - var connection = @"Server=sql101labs1793591179000.westeurope.cloudapp.azure.com;Database=sql101.#NAME.SURNAME;User Id=myUsername;Password=myPassword;"; + var connection = @"Server=sql101labs1793591179000.westeurope.cloudapp.azure.com;Database=sql101.mbongiseni.ncube;User Id=mbongisenincube;Password=Amigo199592;"; + services.AddSingleton(Configuration); + services.AddDbContext (options => options.UseSqlServer(connection)); } diff --git a/src/MyTimesheet/MyTimesheet/appsettings.json b/src/MyTimesheet/MyTimesheet/appsettings.json index def9159..1cb9760 100644 --- a/src/MyTimesheet/MyTimesheet/appsettings.json +++ b/src/MyTimesheet/MyTimesheet/appsettings.json @@ -1,8 +1,9 @@ { - "Logging": { - "LogLevel": { - "Default": "Warning" - } - }, - "AllowedHosts": "*" + "Logging": { + "LogLevel": { + "Default": "Warning" + } + }, + "AllowedHosts": "*", + "CacheConnection":"101.redis.cache.windows.net,abortConnect=false,ssl=true,password=85BYRVqUHV6aW7Jz8zIIxRnaYMgbBd2kwo4bpDiz4vw=" }