Skip to content

Commit

Permalink
Refactored common google request helpers.
Browse files Browse the repository at this point in the history
  • Loading branch information
khanjal committed Nov 25, 2024
1 parent 278463d commit 508861a
Show file tree
Hide file tree
Showing 8 changed files with 249 additions and 224 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ This project is a library designed to manage interactions between a custom API s

## Sheet Styling
* Configure alternating row colors and enable full sheet protection
* Assign names and colors to sheet tabs

## Other Features
* Appending data to specified sheets
Expand Down
12 changes: 12 additions & 0 deletions RLE.Core/Extensions/EnumerableExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace RLE.Core.Extensions;

public static class EnumerableExtensions
{
public static void AddRange<T>(this IList<T> collection, IEnumerable<T> items)
{
foreach (var item in items)
{
collection.Add(item);
}
}
}
102 changes: 102 additions & 0 deletions RLE.Core/Helpers/GoogleRequestHelpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
using Google.Apis.Sheets.v4.Data;
using RLE.Core.Constants;
using RLE.Core.Enums;
using RLE.Core.Models.Google;

namespace RLE.Core.Helpers;

public static class GoogleRequestHelpers
{

public static Request GenerateAppendCells(SheetModel sheet)
{
// Create Sheet Headers
var appendCellsRequest = new AppendCellsRequest
{
Fields = GoogleConfig.FieldsUpdate,
Rows = SheetHelpers.HeadersToRowData(sheet!),
SheetId = sheet!.Id
};

return new Request { AppendCells = appendCellsRequest };
}

public static List<Request> GenerateAppendDimension(SheetModel sheet)
{
List<Request> requests = [];
// Append more columns if the default amount isn't enough
var defaultColumns = GoogleConfig.DefaultColumnCount;
if (sheet!.Headers.Count > defaultColumns)
{
var appendDimensionRequest = new AppendDimensionRequest
{
Dimension = GoogleConfig.AppendDimensionType,
Length = sheet.Headers.Count - defaultColumns,
SheetId = sheet.Id
};
requests.Add(new Request { AppendDimension = appendDimensionRequest });
}

return requests;
}

public static Request GenerateBandingRequest(SheetModel sheet)
{
// Add alternating colors
var addBandingRequest = new AddBandingRequest
{
BandedRange = new BandedRange
{
BandedRangeId = sheet!.Id,
Range = new GridRange { SheetId = sheet.Id },
RowProperties = new BandingProperties { HeaderColor = SheetHelpers.GetColor(sheet!.TabColor), FirstBandColor = SheetHelpers.GetColor(ColorEnum.WHITE), SecondBandColor = SheetHelpers.GetColor(sheet!.CellColor) }
}
};
return new Request { AddBanding = addBandingRequest };
}
public static Request GenerateProtectedRangeForHeaderOrSheet(SheetModel sheet)
{
// Protect sheet or header
var addProtectedRangeRequest = new AddProtectedRangeRequest();
if (sheet!.ProtectSheet)
{
addProtectedRangeRequest = new AddProtectedRangeRequest
{
ProtectedRange = new ProtectedRange { Description = ProtectionWarnings.SheetWarning, Range = new GridRange { SheetId = sheet.Id }, WarningOnly = true }
};
}
else
{
// Protect full header if sheet isn't protected.
var range = new GridRange
{
SheetId = sheet.Id,
StartColumnIndex = 0,
EndColumnIndex = sheet!.Headers.Count,
StartRowIndex = 0,
EndRowIndex = 1
};

addProtectedRangeRequest.ProtectedRange = new ProtectedRange { Description = ProtectionWarnings.HeaderWarning, Range = range, WarningOnly = true };
}

return new Request { AddProtectedRange = addProtectedRangeRequest };
}

public static Request GenerateSheetPropertes(SheetModel sheet)
{
var sheetRequest = new AddSheetRequest
{
Properties = new SheetProperties
{
// Create Sheet With Properties
SheetId = sheet.Id,
Title = sheet!.Name,
TabColor = SheetHelpers.GetColor(sheet.TabColor),
GridProperties = new GridProperties { FrozenColumnCount = sheet.FreezeColumnCount, FrozenRowCount = sheet.FreezeRowCount }
}
};

return new Request { AddSheet = sheetRequest };
}
}
1 change: 1 addition & 0 deletions RLE.Core/Models/Google/SheetModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ namespace RLE.Core.Models.Google;

public class SheetModel
{
public int Id { get; set; }
public string Name { get; set; } = "";
public List<SheetCellModel> Headers { get; set; } = [];
public ColorEnum TabColor { get; set; }
Expand Down
26 changes: 13 additions & 13 deletions RLE.Gig.Tests/Helpers/GoogleSheetHelpersTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,19 +13,19 @@ public class GoogleSheetHelpersTests
{
public static IEnumerable<object[]> Sheets =>
[
[AddressMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.ADDRESSES])],
[DailyMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.DAILY])],
[MonthlyMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.MONTHLY])],
[NameMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.NAMES])],
[PlaceMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.PLACES])],
[RegionMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.REGIONS])],
[ServiceMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.SERVICES])],
[ShiftMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.SHIFTS])],
[TripMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.TRIPS])],
[TypeMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.TYPES])],
[WeekdayMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.WEEKDAYS])],
[WeeklyMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.WEEKLY])],
[YearlyMapper.GetSheet(), GoogleSheetHelper.Generate([SheetEnum.YEARLY])],
[AddressMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.ADDRESSES])],
[DailyMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.DAILY])],
[MonthlyMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.MONTHLY])],
[NameMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.NAMES])],
[PlaceMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.PLACES])],
[RegionMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.REGIONS])],
[ServiceMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.SERVICES])],
[ShiftMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.SHIFTS])],
[TripMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.TRIPS])],
[TypeMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.TYPES])],
[WeekdayMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.WEEKDAYS])],
[WeeklyMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.WEEKLY])],
[YearlyMapper.GetSheet(), GenerateSheetsHelpers.Generate([SheetEnum.YEARLY])],
];

[Theory]
Expand Down
119 changes: 119 additions & 0 deletions RLE.Gig/Helpers/GenerateSheetsHelpers.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
using Google.Apis.Sheets.v4.Data;
using RLE.Gig.Enums;
using RLE.Gig.Mappers;
using RLE.Core.Constants;
using RLE.Core.Enums;
using RLE.Core.Models.Google;
using RLE.Core.Helpers;
using RLE.Core.Extensions;

namespace RLE.Gig.Helpers;

public static class GenerateSheetsHelpers
{
private static BatchUpdateSpreadsheetRequest? _batchUpdateSpreadsheetRequest;
private static List<RepeatCellRequest>? _repeatCellRequests;

public static BatchUpdateSpreadsheetRequest Generate(List<SheetEnum> sheets)
{
_batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
_batchUpdateSpreadsheetRequest.Requests = [];
_repeatCellRequests = [];

sheets.ForEach(sheet =>
{
var sheetModel = GetSheetModel(sheet);
var random = new Random();
sheetModel.Id = random.Next();

_batchUpdateSpreadsheetRequest!.Requests.Add(GoogleRequestHelpers.GenerateSheetPropertes(sheetModel));
_batchUpdateSpreadsheetRequest!.Requests.AddRange(GoogleRequestHelpers.GenerateAppendDimension(sheetModel));
_batchUpdateSpreadsheetRequest!.Requests.Add(GoogleRequestHelpers.GenerateAppendCells(sheetModel));
GenerateHeadersFormatAndProtection(sheetModel);
_batchUpdateSpreadsheetRequest!.Requests.Add(GoogleRequestHelpers.GenerateBandingRequest(sheetModel));
_batchUpdateSpreadsheetRequest!.Requests.Add(GoogleRequestHelpers.GenerateProtectedRangeForHeaderOrSheet(sheetModel));
});

_repeatCellRequests.ForEach(request =>
{
_batchUpdateSpreadsheetRequest.Requests.Add(new Request { RepeatCell = request });
});

return _batchUpdateSpreadsheetRequest;
}

private static SheetModel GetSheetModel(SheetEnum sheetEnum)
{
return sheetEnum switch
{
SheetEnum.ADDRESSES => AddressMapper.GetSheet(),
SheetEnum.DAILY => DailyMapper.GetSheet(),
SheetEnum.MONTHLY => MonthlyMapper.GetSheet(),
SheetEnum.NAMES => NameMapper.GetSheet(),
SheetEnum.PLACES => PlaceMapper.GetSheet(),
SheetEnum.REGIONS => RegionMapper.GetSheet(),
SheetEnum.SERVICES => ServiceMapper.GetSheet(),
SheetEnum.SHIFTS => ShiftMapper.GetSheet(),
SheetEnum.TRIPS => TripMapper.GetSheet(),
SheetEnum.TYPES => TypeMapper.GetSheet(),
SheetEnum.WEEKDAYS => WeekdayMapper.GetSheet(),
SheetEnum.WEEKLY => WeeklyMapper.GetSheet(),
SheetEnum.YEARLY => YearlyMapper.GetSheet(),
_ => throw new NotImplementedException(),
};
}

private static void GenerateHeadersFormatAndProtection(SheetModel sheet)
{
// Format/Protect Column Cells
sheet!.Headers.ForEach(header =>
{
var range = new GridRange
{
SheetId = sheet.Id,
StartColumnIndex = header.Index,
EndColumnIndex = header.Index + 1,
StartRowIndex = 1,
};

// If whole sheet isn't protected then protect certain columns
if (!string.IsNullOrEmpty(header.Formula) && !sheet.ProtectSheet)
{
var addProtectedRangeRequest = new AddProtectedRangeRequest
{
ProtectedRange = new ProtectedRange { Description = ProtectionWarnings.ColumnWarning, Range = range, WarningOnly = true }
};
_batchUpdateSpreadsheetRequest!.Requests.Add(new Request { AddProtectedRange = addProtectedRangeRequest });
}

// If there's no format or validation then go to next header
if (header.Format == null && header.Validation == null)
{
return;
}

// Set start/end for formatting
range.StartRowIndex = 1;
range.EndRowIndex = null;

var repeatCellRequest = new RepeatCellRequest
{
Fields = GoogleConfig.FieldsUpdate,
Range = range,
Cell = new CellData()
};

if (header.Format != null)
{
repeatCellRequest.Cell.UserEnteredFormat = SheetHelpers.GetCellFormat((FormatEnum)header.Format);
}

if (header.Validation != null)
{
repeatCellRequest.Cell.DataValidation = GigSheetHelpers.GetDataValidation((ValidationEnum)header.Validation);
}

_repeatCellRequests!.Add(repeatCellRequest);
});
}
}
Loading

0 comments on commit 508861a

Please sign in to comment.