Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Interview Coding Challenge Submission - Joseph M. Fallecker #55

Open
wants to merge 32 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
ab894ef
Inital Commit
jmfallecker Oct 26, 2020
04419e5
add DomainModel project
jmfallecker Oct 27, 2020
91b9b3e
add git ignore file
jmfallecker Oct 27, 2020
f947f89
Add domain logic
jmfallecker Oct 27, 2020
2588456
add data access folder and IRestaurantReviewRepository interface
jmfallecker Oct 27, 2020
ac850e5
Remove unnecessarily tracked files
jmfallecker Oct 27, 2020
3234264
Update git ignore
jmfallecker Oct 27, 2020
5714798
commit the project and solution files
jmfallecker Oct 27, 2020
5579b05
Delete RestaurantReviews.DomainModel.fsproj.nuget.dgspec.json
jmfallecker Oct 27, 2020
6a52960
Delete RestaurantReviews.DomainModel.fsproj.nuget.g.targets
jmfallecker Oct 27, 2020
8487765
Delete RestaurantReviews.DomainModel.fsproj.nuget.g.props
jmfallecker Oct 27, 2020
2881b49
Remove the bin and obj files from the repository
jmfallecker Oct 27, 2020
10ddafc
Merge branch 'master' of https://github.com/jmfallecker/RestaurantRev…
jmfallecker Oct 27, 2020
4447c8b
Added SQL Server project for data persistence, updated some domain mo…
jmfallecker Oct 27, 2020
03009bd
update gitignore so that it covers the SQLServer project bin and obj …
jmfallecker Oct 28, 2020
f2934e0
Commit the SQL Server scripts for tables and insert sprocs
jmfallecker Oct 28, 2020
f594ee9
Delete the obj file that remained
jmfallecker Oct 28, 2020
20e1fa7
Push all before bed to prevent any kind of crash like what happenend …
jmfallecker Oct 29, 2020
6be5385
Remove SQL Scripts from solution folder, will re-add later when updated
jmfallecker Oct 30, 2020
4770bf1
Remove SQL Server project files
jmfallecker Oct 30, 2020
4311beb
Add 'unwrap' functions to the domain model to allow the C# data acces…
jmfallecker Oct 30, 2020
17fa4c8
Add the 'PutRestaurant' method, scripted the sproc and tested manually
jmfallecker Oct 30, 2020
cf28e20
Add the initial 'Database Scripts' folder including first 2 scripts t…
jmfallecker Oct 30, 2020
808714c
Add support for retrieving restaurants by city, although, the return …
jmfallecker Oct 30, 2020
b8133a6
Fix the issue with the results from 'GetRestaurants' endpoint. The C#…
jmfallecker Oct 30, 2020
a2ded2c
Refactor a bit for clarity and reusability
jmfallecker Oct 30, 2020
c34f1d7
Add logic for 'AddReview'. This one is a bit heavy with code, so my a…
jmfallecker Oct 30, 2020
f34c4e8
Another larger commit, sadly. Was in the middle of manual integration…
jmfallecker Oct 30, 2020
566e363
Updated my comments, adjusted small bug fixes
jmfallecker Oct 31, 2020
a38fade
Cleanup autogenerated classes, switch connectionstring to DI model th…
jmfallecker Oct 31, 2020
14b0b6f
Inline a few function definitions because they were unnecessary
jmfallecker Oct 31, 2020
f4beceb
Write a probably way-too-long explanation of things, but it makes me …
jmfallecker Oct 31, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Ignore Visual Studio files
.vs/

# Ignore bin and obj folders of projects
RestaurantReviews/obj/*
RestaurantReviews/bin/*
RestaurantReviews/.vs/*
RestaurantReviews.DomainModel/obj/*
RestaurantReviews.DomainModel/bin/*
RestaurantReviews.DomainModel/.vs/*
RestaurantReviews.SQLServer/obj/*
RestaurantReviews.SQLServer/bin/*
28 changes: 28 additions & 0 deletions Database Scripts/001_CreateDatabase.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
CREATE DATABASE [RestaurantReviews];
GO
USE RestaurantReviews;
GO

CREATE TABLE [dbo].[Restaurant]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[Name] NVARCHAR(100) NOT NULL,
[City] NVARCHAR(100) NOT NULL
)
CREATE TABLE [dbo].[User]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[FirstName] NVARCHAR(20),
[LastName] NVARCHAR(20)
)
CREATE TABLE [dbo].[Review]
(
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
[UserId] UNIQUEIDENTIFIER NOT NULL,
[RestaurantId] UNIQUEIDENTIFIER NOT NULL,
[Rating] INT NOT NULL,
[ReviewText] NVARCHAR(500),
[IsDeleted] BIT,
CONSTRAINT FK_Review_User FOREIGN KEY (UserId) REFERENCES [dbo].[User],
CONSTRAINT FK_Review_Restaurant FOREIGN KEY (RestaurantId) REFERENCES [dbo].[Restaurant]
)
23 changes: 23 additions & 0 deletions Database Scripts/002_CreateProcedure_InsertRestaurant.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertRestaurant]
@id UNIQUEIDENTIFIER,
@name NVARCHAR(100),
@city NVARCHAR(100)
AS
IF NOT EXISTS (SELECT 1
FROM [dbo].[Restaurant]
WHERE Name = @name AND City = @city)

INSERT INTO Restaurant (Id, Name, City)
VALUES (@id, @name, @city)

RETURN 0
GO
25 changes: 25 additions & 0 deletions Database Scripts/003_CreateProcedure_SelectRestaurantsByCity.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SelectRestaurantsByCity]
@city NVARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT [Id], [Name]
FROM Restaurant
WHERE City = @city
END
GO


23 changes: 23 additions & 0 deletions Database Scripts/004_CreateProcedure_SelectRestaurant.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SelectRestaurant]
@id UNIQUEIDENTIFIER
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT [Name], [City]
FROM Restaurant
WHERE Id = @id
END
GO
23 changes: 23 additions & 0 deletions Database Scripts/005_CreateProcedure_SelectUser.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[SelectUser]
@id UNIQUEIDENTIFIER
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT [FirstName], [LastName]
FROM [dbo].[User]
WHERE Id = @id
END
GO
22 changes: 22 additions & 0 deletions Database Scripts/006_CreateProcedure_InsertReview.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertReview]
@id UNIQUEIDENTIFIER,
@userId UNIQUEIDENTIFIER,
@restaurantId UNIQUEIDENTIFIER,
@rating INT,
@reviewText NVARCHAR(500)
AS
INSERT INTO Review (Id, UserId, RestaurantId, Rating, ReviewText, IsDeleted)
VALUES (@id, @userId, @restaurantId, @rating, @reviewText, 0)
RETURN 0
GO


27 changes: 27 additions & 0 deletions Database Scripts/007_CreateProcedure_SelectReviewByUser.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



CREATE PROCEDURE [dbo].[SelectReviewsByUser]
@id UNIQUEIDENTIFIER
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT review.[Id], review.[RestaurantId], [Rating], [ReviewText]
FROM [dbo].[Review] review
WHERE UserId = @id AND IsDeleted = 0
END
GO


21 changes: 21 additions & 0 deletions Database Scripts/008_CreateProcedure_DeleteReview.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE [dbo].[DeleteReview]
@id UNIQUEIDENTIFIER
AS
BEGIN
UPDATE Review
SET IsDeleted = 1
WHERE Id = @id
END
GO


24 changes: 24 additions & 0 deletions Database Scripts/009_CreateProcedure_InsertUser.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
USE [RestaurantReviews]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertUser]
@id UNIQUEIDENTIFIER,
@firstName NVARCHAR(20),
@lastName NVARCHAR(20)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Insert statements for procedure here
INSERT INTO [dbo].[User] (Id, FirstName, LastName)
VALUES (@id, @firstName, @lastName)
END
GO
85 changes: 85 additions & 0 deletions RestaurantReviews.DomainModel/Library.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
namespace RestaurantReviews.DomainModel

open System

type NonEmptyString = private NonEmptyString of string
module NonEmptyString =
let create str =
if String.IsNullOrWhiteSpace(str) then
"The given string must not be empty or whitespace" |> Error
else
NonEmptyString str |> Ok

let unwrap (NonEmptyString str) = str


type Id = private Id of Guid
module Id =
let create id =
if id = Guid.Empty then
"Id may not be an empty Guid." |> Error
else
Id id |> Ok

let unwrap (Id id) = id


type Rating = private Rating of int
module Rating =
let lower = 0
let upper = 5

let create rating =
if rating < lower || rating > upper then
String.Format("Rating must be between {0} and {1}", lower, upper) |> Error
else
Rating rating |> Ok

let unwrap (Rating rating) = rating


type User = {
Id: Id
FirstName: NonEmptyString // require first name?
LastName: string
}
module User =
let unwrap user = {|
Id = Id.unwrap user.Id
FirstName = NonEmptyString.unwrap user.FirstName
LastName = user.LastName
|}


type Restaurant = {
Id: Id
Name: NonEmptyString
City: NonEmptyString
}
module Restaurant =
let unwrap restaurant = {|
Id = Id.unwrap restaurant.Id
Name = NonEmptyString.unwrap restaurant.Name
City = NonEmptyString.unwrap restaurant.City
|}

let unwrapMany restaurants = Seq.map unwrap restaurants


type Review = {
Id: Id
User: Id
Restaurant: Id
Rating: Rating
ReviewText: string
}
module Review =
let unwrap review = {|
Id = Id.unwrap review.Id
User = Id.unwrap review.User
Restaurant = Id.unwrap review.Restaurant
Rating = Rating.unwrap review.Rating
ReviewText = review.ReviewText
|}

let unwrapMany reviews = Seq.map unwrap reviews
11 changes: 11 additions & 0 deletions RestaurantReviews.DomainModel/RestaurantReviews.DomainModel.fsproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Compile Include="Library.fs" />
</ItemGroup>

</Project>
Loading