From 043bc8dbc51600e213ad2c768cfcacf186ad4789 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bodn=C3=A1r=20S=C3=A1ndor?= Date: Sun, 8 Jun 2025 20:02:46 +0200 Subject: [PATCH] .NET Challenge --- .NET/library/Controllers/LoanController.cs | 49 ++++ .NET/library/DataAccess/ILoanService.cs | 12 + .NET/library/DataAccess/LibraryContext.cs | 2 + .NET/library/DataAccess/LoanService.cs | 211 ++++++++++++++++ .NET/library/Model/Fine.cs | 16 ++ .NET/library/Model/Loan.cs | 18 ++ .NET/library/Model/LoanedBook.cs | 8 + .NET/library/Model/OnLoanModel.cs | 8 + .NET/library/Program.cs | 1 + .NET/library/SeedData.cs | 22 +- .../17.12.38.29086/CodeChunks.db | Bin 0 -> 69632 bytes .../17.12.38.29086/SemanticSymbols.db | Bin 0 -> 32768 bytes .vs/OneBeyond/v17/.wsuo | Bin 0 -> 13312 bytes .vs/OneBeyond/v17/DocumentLayout.json | 229 ++++++++++++++++++ .vs/VSWorkspaceState.json | 7 + 15 files changed, 581 insertions(+), 2 deletions(-) create mode 100644 .NET/library/Controllers/LoanController.cs create mode 100644 .NET/library/DataAccess/ILoanService.cs create mode 100644 .NET/library/DataAccess/LoanService.cs create mode 100644 .NET/library/Model/Fine.cs create mode 100644 .NET/library/Model/Loan.cs create mode 100644 .NET/library/Model/LoanedBook.cs create mode 100644 .NET/library/Model/OnLoanModel.cs create mode 100644 .vs/OneBeyond/CopilotIndices/17.12.38.29086/CodeChunks.db create mode 100644 .vs/OneBeyond/CopilotIndices/17.12.38.29086/SemanticSymbols.db create mode 100644 .vs/OneBeyond/v17/.wsuo create mode 100644 .vs/OneBeyond/v17/DocumentLayout.json create mode 100644 .vs/VSWorkspaceState.json diff --git a/.NET/library/Controllers/LoanController.cs b/.NET/library/Controllers/LoanController.cs new file mode 100644 index 0000000..cf9c0b3 --- /dev/null +++ b/.NET/library/Controllers/LoanController.cs @@ -0,0 +1,49 @@ +using Microsoft.AspNetCore.Mvc; +using OneBeyondApi.DataAccess; +using OneBeyondApi.Model; + +namespace OneBeyondApi.Controllers +{ + [ApiController] + [Route("[controller]")] + public class LoanController : ControllerBase + { + private readonly ILogger _logger; + private readonly ILoanService _loanService; + + public LoanController(ILogger logger, ILoanService loanService) + { + _logger = logger; + _loanService = loanService; + } + + [HttpGet] + [Route("OnLoan")] + public IList Get() + { + return _loanService.GetAllLoaned(); + } + + [HttpPost] + [Route("ReturnLoan{bookStockGuid:required}")] + public Guid Post(Guid bookStockGuid) + { + return _loanService.ReturnBook(bookStockGuid); + } + + [HttpPost] + [Route("ReserveBook")] + public Guid ReserveBook(Guid bookStockId, Guid borrowerId) + { + return _loanService.ReserveBook(bookStockId, borrowerId); + } + + [HttpGet] + [Route("GetFirstAvailability")] + public DateTime GetFirstAvailbility(Guid? bookId, string? bookTitle) + { + return _loanService.GetFirstAvailableDate(bookId, bookTitle); + } + + } +} diff --git a/.NET/library/DataAccess/ILoanService.cs b/.NET/library/DataAccess/ILoanService.cs new file mode 100644 index 0000000..2344a5b --- /dev/null +++ b/.NET/library/DataAccess/ILoanService.cs @@ -0,0 +1,12 @@ +using OneBeyondApi.Model; + +namespace OneBeyondApi.DataAccess +{ + public interface ILoanService + { + List GetAllLoaned(); + Guid ReturnBook(Guid bookStockId); + Guid ReserveBook(Guid bookStockId, Guid borrowerId); + DateTime GetFirstAvailableDate(Guid? bookId, string bookTitle); + } +} diff --git a/.NET/library/DataAccess/LibraryContext.cs b/.NET/library/DataAccess/LibraryContext.cs index 91510e0..6c8533b 100644 --- a/.NET/library/DataAccess/LibraryContext.cs +++ b/.NET/library/DataAccess/LibraryContext.cs @@ -13,5 +13,7 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) public DbSet Books { get; set; } public DbSet Catalogue { get; set; } public DbSet Borrowers { get; set; } + public DbSet Loans { get; set; } + public DbSet Fines { get; set; } } } diff --git a/.NET/library/DataAccess/LoanService.cs b/.NET/library/DataAccess/LoanService.cs new file mode 100644 index 0000000..d00773e --- /dev/null +++ b/.NET/library/DataAccess/LoanService.cs @@ -0,0 +1,211 @@ +using Microsoft.EntityFrameworkCore; +using OneBeyondApi.Model; + +namespace OneBeyondApi.DataAccess +{ + public class LoanService : ILoanService + { + int _finePerDay = 0; + int _defaultLoanDays = 0; + + /// + /// Constructor + /// + /// Default value => 50, but can change in DI + /// Default value => 5, but can change in DI + public LoanService(int finePerDay = 50, int defaultLoanDays = 5) + { + _finePerDay = finePerDay; + _defaultLoanDays = defaultLoanDays; + } + + /// + /// Get all currently loaned book grouped by the Borrowers + /// + /// + /// A Grouped list of Books by the borrowers (the full details of the borrowers) + /// and the books they loaned with the stock id (to able to return it) and the title of the book + /// + public List GetAllLoaned() + { + using var context = new LibraryContext(); + + var list = context.Catalogue + .Include(x => x.Book) + .Include(x => x.OnLoanTo) + .Where(x => x.OnLoanTo != null) + .GroupBy(x => x.OnLoanTo) + .Select(x => new OnLoanModel() + { + Borrower = x.Key, + Books = x.Select(b => new LoanedBook + { + BookStockId = b.Id, + Title = b.Book.Name + }).ToList() + }).ToList(); + + return list; + } + + /// + /// Returns a borrowed book. Set the bookstock loandata to null + /// + /// The returned bookstock id + /// + /// An empty guid if the return not succeded and the returned + /// bookstock id if the returns succseeded + /// + public Guid ReturnBook(Guid bookStockId) + { + Guid retVal = Guid.Empty; + using var context = new LibraryContext(); + + var book = context.Catalogue.Include(x => x.OnLoanTo).FirstOrDefault(x => x.Id == bookStockId); + + if (book != null && book.OnLoanTo != null && book.LoanEndDate != null) + { + //If the book returned late => add fine + var lateDays = (DateTime.Today - book.LoanEndDate.Value).Days; + if (lateDays > 0) + { + context.Fines.Add(GetFine(book.OnLoanTo, lateDays)); + } + + book.LoanEndDate = null; + book.OnLoanTo = null; + if (context.SaveChanges() != 0) + { + retVal = book.Id; + } + } + + return retVal; + } + + /// + /// Reserve a book or loan it if available + /// + /// + /// + public Guid ReserveBook(Guid bookStockId, Guid borrowerId) + { + Guid retVal = Guid.Empty; + using var context = new LibraryContext(); + + var bookStock = context.Catalogue + .Include(x => x.Book).Include(x => x.OnLoanTo) + .FirstOrDefault(x => x.Id == bookStockId); + + var borrower = context.Borrowers.Find(borrowerId); + + if (bookStock != null && borrower != null) + { + //If the book is on Loan then reserve the first available date or else borrow now + if (bookStock.LoanEndDate.HasValue) + { + var lastReserve = context.Loans.Where(x => x.BookStock.Id == bookStockId) + .OrderByDescending(x => x.LoanEndDate).FirstOrDefault(); + + context.Loans.Add(AddLoanReserve(lastReserve, borrower, bookStock)); + } + else + { + bookStock.LoanEndDate = DateTime.Now.AddDays(_defaultLoanDays); + bookStock.OnLoanTo = borrower; + } + + context.SaveChanges(); + retVal = bookStockId; + } + + return retVal; + } + + /// + /// Get the first loan date for a book + /// + /// The id of the needed book + /// The title of the needed book + /// Returns the first available date when a stock from a book is loanable, + /// if there is no stock for this book than returns DateTime.MaxValue + /// + public DateTime GetFirstAvailableDate(Guid? bookId, string bookTitle) + { + DateTime firstAvailableDate = DateTime.MaxValue; + using var context = new LibraryContext(); + //Get all stock from a book + var bookStocks = context.Catalogue + .Include(x => x.Book) + .Where(x => bookId != null ? x.Book.Id == bookId : x.Book.Name == bookTitle) + .ToList(); + + //If one of the bookstock is available than the book is loanable today + if (bookStocks.Any(x => x.LoanEndDate == null)) + { + firstAvailableDate = DateTime.Now; + } + else + { + //Get the first available date from the reservations grouped by bookstocks + var bookStockIds = bookStocks.Select(x => x.Id).ToList(); + var firstAvailableDatesFromReservations = context.Loans.Include(x => x.BookStock) + .Where(x => bookStockIds.Contains(x.BookStock.Id)) + .GroupBy(x => x.BookStock).Select(x => x.OrderByDescending(d => d.LoanEndDate).First()).ToList(); + + //If there is any reservation + if (firstAvailableDatesFromReservations.Count != 0) + { + //iterate through the booksStocks to find the first available date + foreach (var bookStock in bookStocks) + { + //if there is reservations for the bookStock than get the earliest availability + //otherwise get the current loan end date + var bookStockFirstAvailableDate = firstAvailableDatesFromReservations + .FirstOrDefault(x => x.BookStock.Id == bookStock.Id)?.LoanEndDate ?? bookStock.LoanEndDate.Value; + + //if the earliest available reservation is earlier than the current eariliest than choose that value for the earliest date + firstAvailableDate = firstAvailableDate < bookStockFirstAvailableDate ? firstAvailableDate : bookStockFirstAvailableDate; + } + } + else + { + //The first available date from the current loans, it always has value + firstAvailableDate = bookStocks.OrderBy(x => x.LoanEndDate).First().LoanEndDate.Value; + } + } + + return firstAvailableDate; + } + + private Loan AddLoanReserve(Loan lastReserve, Borrower borrower, BookStock bookStock) + { + DateTime loanStart = lastReserve != null ? + lastReserve.LoanEndDate : bookStock.LoanEndDate.Value; + + Loan loan = new() + { + Id = bookStock.Id, + Borrower = borrower, + BookStock = bookStock, + LoanStartDate = loanStart, + LoanEndDate = loanStart.AddDays(_defaultLoanDays) + + }; + + return loan; + } + + private Fine GetFine(Borrower borrower, int lateDays) + { + Fine fine = new() + { + Borrower = borrower, + PaidDate = DateTime.Now, + Amount = _finePerDay * lateDays + }; + + return fine; + } + } +} diff --git a/.NET/library/Model/Fine.cs b/.NET/library/Model/Fine.cs new file mode 100644 index 0000000..b969fc7 --- /dev/null +++ b/.NET/library/Model/Fine.cs @@ -0,0 +1,16 @@ +namespace OneBeyondApi.Model +{ + public class Fine + { + public Guid Id { get; set; } + public Borrower Borrower { get; set; } + /// + /// The fine for the late return + /// + public int Amount { get; set; } + /// + /// If a fine paid than this is the pay date + /// + public DateTime? PaidDate { get; set; } + } +} diff --git a/.NET/library/Model/Loan.cs b/.NET/library/Model/Loan.cs new file mode 100644 index 0000000..f8ba255 --- /dev/null +++ b/.NET/library/Model/Loan.cs @@ -0,0 +1,18 @@ +namespace OneBeyondApi.Model +{ + public class Loan + { + public Guid Id { get; set; } + public BookStock BookStock { get; set; } + public Borrower Borrower { get; set; } + /// + /// The planned/loaned date + /// + public DateTime LoanStartDate { get; set; } + /// + /// The planned end date for the loan + /// + public DateTime LoanEndDate { get; set; } + + } +} diff --git a/.NET/library/Model/LoanedBook.cs b/.NET/library/Model/LoanedBook.cs new file mode 100644 index 0000000..08f7aa4 --- /dev/null +++ b/.NET/library/Model/LoanedBook.cs @@ -0,0 +1,8 @@ +namespace OneBeyondApi.Model +{ + public class LoanedBook + { + public Guid BookStockId { get; set; } + public string Title { get; set; } + } +} diff --git a/.NET/library/Model/OnLoanModel.cs b/.NET/library/Model/OnLoanModel.cs new file mode 100644 index 0000000..68ccb2e --- /dev/null +++ b/.NET/library/Model/OnLoanModel.cs @@ -0,0 +1,8 @@ +namespace OneBeyondApi.Model +{ + public class OnLoanModel + { + public Borrower Borrower { get; set; } + public List Books { get; set; } = []; + } +} diff --git a/.NET/library/Program.cs b/.NET/library/Program.cs index ca5d07b..63982f5 100644 --- a/.NET/library/Program.cs +++ b/.NET/library/Program.cs @@ -8,6 +8,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(_ => new LoanService(100, 7)); // Seed test data into memory DB SeedData.SetInitialData(); diff --git a/.NET/library/SeedData.cs b/.NET/library/SeedData.cs index a8218dd..1b9fb17 100644 --- a/.NET/library/SeedData.cs +++ b/.NET/library/SeedData.cs @@ -76,11 +76,26 @@ public static void SetInitialData() LoanEndDate = DateTime.Now.Date.AddDays(7) }; + var bookOnLoanWithReservation = new BookStock + { + Book = agileBook, + OnLoanTo = daveSmith, + LoanEndDate = DateTime.Now.Date.AddDays(3) + }; + + var reservationforBook1 = new Loan + { + BookStock = bookOnLoanWithReservation, + Borrower = daveSmith, + LoanStartDate = DateTime.Now.Date.AddDays(3), + LoanEndDate = DateTime.Now.Date.AddDays(10) + }; + var rustBookStock = new BookStock { Book = rustBook, - OnLoanTo = null, - LoanEndDate = null + OnLoanTo = daveSmith, + LoanEndDate = DateTime.Now.Date.AddDays(-3) }; using (var context = new LibraryContext()) @@ -101,6 +116,9 @@ public static void SetInitialData() context.Catalogue.Add(bookNotOnLoan); context.Catalogue.Add(bookOnLoanUntilNextWeek); context.Catalogue.Add(rustBookStock); + context.Catalogue.Add(bookOnLoanWithReservation); + + context.Loans.Add(reservationforBook1); context.SaveChanges(); diff --git a/.vs/OneBeyond/CopilotIndices/17.12.38.29086/CodeChunks.db b/.vs/OneBeyond/CopilotIndices/17.12.38.29086/CodeChunks.db new file mode 100644 index 0000000000000000000000000000000000000000..aa5d6e1877ba096aaa27cf3251fef8ec933c4dcf GIT binary patch literal 69632 zcmeI&O>g5w7{GD6+l|w_wCTyGO0KGsM7vrxsw%_*iI6(QZ0dAV7g`Avg~q!Zwsp2` zDwdc&T`lbvi^~p*kjMw&+nP>B$^&Q?M-I3_H24} zF`8*RQcYS~l0MZmNs`LqZ(aOFuaekUj&{VSoY-EpS(Y9>`>VS4k5p5-((0dUzpehf z`a$)g`gi50@}r7X`gP^I;vYq+_>0n2eqYoG

~v00Id7KLy;%nxd+z?0!EReS2025)&8ufYjwY@t~IJ9O}y&HxULzdrSIzl&Fov6dED!1hXdoFJvh~# z=%-ry*yoU#4-`tn@N z@Wau~Z0he1{rba}|FQ0FR26k=OTLx;J2$)<_P9Gaw-cMI=_nFM-ZvKSLWiT-i-n== zt`<~dYf&hPI~leTJ8N#OqNv7>?6xLeM8?Um^Ww&N>Bro?vM+CJ=j?}|%ot}Js)i98 z=AM2c67|mdb**n|^^8`8PEafo-Mlr+in_BSzv=kW8K-9yRnqbqXT%xs4`y|#RLA+x z6W;RN?VDjk-Tpu~_D!#cHo}WGwSnH%2fEqOk2JsRVD#$M#ChH@#!ZiBPw(ks9CX@8 zo%Wud(U6}S@8m>7epz-4qL*Km6!qh6*h`w$W+l#Hcv>>(m5i*#t-aUaH%AwC_F##!+_RnM-hi5autdkhSQZ^mCO0@W zm6F6DTbP)SRtoBq?L}iY2{mjb_e$Se9lHRovAako%!c#MrZYJCFPQgV&H-QQf4ocMafR=lk^%Zj?YA-ifc)b^%lHy47+A7me==wu-Ya~7_6+Tfn_yP^vOVa0-X1h|A3tu!6LqKG>v`V_ z%)WRYMi0Y!Z*)ET>PpPj*5txIo}Jz8vte=r+eUPirpW4tO9i#Fu_&uiIKx)7bx(Yc zDth0gs@_}8d*g)w0tg_000IagfB*srAb;L)BF%cqw00IagfB*srAbt>u literal 0 HcmV?d00001 diff --git a/.vs/OneBeyond/CopilotIndices/17.12.38.29086/SemanticSymbols.db b/.vs/OneBeyond/CopilotIndices/17.12.38.29086/SemanticSymbols.db new file mode 100644 index 0000000000000000000000000000000000000000..527188cb8ed54ecf5185a191b8351e89b19f88cd GIT binary patch literal 32768 zcmeI%-)fss90zbs(^yi{_D*^cIP79ZTDFeS>&=>zPHMF^W@}*(Y-84dNoZ@J-Cfvj z_5yo{!QNx9GWGaHW=Lll^)EtC9>5p%QUPxXGTSBQMyd^{s zgbF*?*vXGoc2njFb`?|idAAkeMgLE2^RFOPe+nDFH-Bw>-*~?MWBnOR;(!1IAOHaf zKmY;|fIy)@C`t00ZE;#3jC%f^an^0$4==_+w==q)c)_4Q@Ozdw^pmG+xR31$Cs0#KMIXrQd`RF@v&gGvsBJ5QRrRB znrnyNO{hF1O@H($yi(M!pI0S$dt3Zwhu%dnn`F{)W!AB)9hfvVms*vuLos>^Q*h}a zb;yZh9Ba-wIilx8>$tXIvAW09a(8EiQzPP)cvfo?1ox+DX@$Jk9Q~cOY632Mgg*HU28{|`O5lu7~v)wd?00Izz00bZa0SG_<0uX>eu>k)67yBR=0uX=z1Rwwb2tWV= z5P$##Ag~Mq`2W8QQN$b|009U<00Izz00bZa0SG_<0>uLO|6lBbTnIn_0uX=z1Rwwb z2tWV=5P-lk2;l$!GDHz`fB*y_009U<00Izz00bZa0SFWe;QPPW2e}Y{00bZa0SG_< P0uX=z1Rwx`Wf1rWc+s9; literal 0 HcmV?d00001 diff --git a/.vs/OneBeyond/v17/.wsuo b/.vs/OneBeyond/v17/.wsuo new file mode 100644 index 0000000000000000000000000000000000000000..b37de704f35ef45cef5cf175a5f19d11d611cf8f GIT binary patch literal 13312 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 F{tMFoPAvcc literal 0 HcmV?d00001 diff --git a/.vs/OneBeyond/v17/DocumentLayout.json b/.vs/OneBeyond/v17/DocumentLayout.json new file mode 100644 index 0000000..9d75fda --- /dev/null +++ b/.vs/OneBeyond/v17/DocumentLayout.json @@ -0,0 +1,229 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Projects\\OneBeyond\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 949, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:3:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:1:0:{80454082-9ab8-47d4-af23-82bf6739e2a9}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:2:0:{80454082-9ab8-47d4-af23-82bf6739e2a9}" + }, + { + "$type": "Bookmark", + "Name": "ST:4:0:{80454082-9ab8-47d4-af23-82bf6739e2a9}" + }, + { + "$type": "Bookmark", + "Name": "ST:17:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{13143d73-808b-4a2f-bebb-ccbe9c93fe37}" + }, + { + "$type": "Bookmark", + "Name": "ST:20:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:19:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:18:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:25:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:26:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:27:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:1:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:5:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:34:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:35:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:37:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:38:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:39:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:40:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:41:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:42:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:6:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:44:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:30:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:31:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:21:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:22:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:32:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:33:0:{2456bd12-ecf7-4988-a4a6-67d49173f565}" + }, + { + "$type": "Bookmark", + "Name": "ST:2:0:{809f6ff3-8092-454a-8003-6d4091f9b5bb}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{80454082-9ab8-47d4-af23-82bf6739e2a9}" + }, + { + "$type": "Bookmark", + "Name": "ST:129:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:129:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + }, + { + "$type": "Bookmark", + "Name": "ST:132:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:130:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + }, + { + "$type": "Bookmark", + "Name": "ST:1924764005:0:{13143d73-808b-4a2f-bebb-ccbe9c93fe37}" + }, + { + "$type": "Bookmark", + "Name": "ST:131:0:{1fc202d4-d401-403c-9834-5b218574bb67}" + }, + { + "$type": "Bookmark", + "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}" + } + ] + }, + { + "DockedWidth": 410, + "SelectedChildIndex": -1, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{d78612c7-9962-4b83-95d9-268046dad23a}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{be4d7042-ba3f-11d2-840e-00c04f9902c1}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{605322a2-17ae-43f4-b60f-766556e46c87}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{ecb7191a-597b-41f5-9843-03a4cf275dde}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{3822e751-eb69-4b0e-b301-595a9e4c74d5}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{007a3a6b-b5b2-454d-a2bd-cf929f989be2}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{ca8cc5c7-0231-406a-95cd-aa5ed6ac0190}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{0ad07096-bba9-4900-a651-0598d26f6d24}" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..3201359 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\OneBeyondApi.sln", + "PreviewInSolutionExplorer": false +} \ No newline at end of file