From 0bf3b88f8bd06abc02a8e0ff22d91cb19d5538da Mon Sep 17 00:00:00 2001 From: Fabian Oraze Date: Mon, 13 May 2024 16:04:15 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=94=A7=20feat(membership-service):=20?= =?UTF-8?q?Change=20membership=20service=20to=20use=20simple=20ADO=20.NET,?= =?UTF-8?q?=20adapt=20REST=20endpoints?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/MembershipController.cs | 153 ++++++++++++------ src/membership-service/Membership.cs | 27 ---- .../MembershipService.csproj | 8 +- .../Persistence/DbInitializer.cs | 29 ---- .../Persistence/MariaDbContext.cs | 36 ----- .../Persistence/MembershipDbService.cs | 59 ------- .../Persistence/MembershipEntity.cs | 40 ----- src/membership-service/Program.cs | 104 +++++++----- src/membership-service/README.md | 11 +- src/membership-service/Startup.cs | 59 ++----- 10 files changed, 189 insertions(+), 337 deletions(-) delete mode 100644 src/membership-service/Membership.cs delete mode 100644 src/membership-service/Persistence/DbInitializer.cs delete mode 100644 src/membership-service/Persistence/MariaDbContext.cs delete mode 100644 src/membership-service/Persistence/MembershipDbService.cs delete mode 100644 src/membership-service/Persistence/MembershipEntity.cs diff --git a/src/membership-service/Controllers/MembershipController.cs b/src/membership-service/Controllers/MembershipController.cs index 4182a850..41d31f1c 100644 --- a/src/membership-service/Controllers/MembershipController.cs +++ b/src/membership-service/Controllers/MembershipController.cs @@ -1,65 +1,122 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - +using System; +using System.Data; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using MembershipService.Persistence; -using MySqlConnector; - -namespace MembershipService.Controllers; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using MySql.Data.MySqlClient; -[ApiController] -[Route("[controller]-service")] -public class MembershipController : ControllerBase +namespace MembershipService.Controllers { - + [ApiController] + [Route("[controller]-service")] + public class MembershipController : ControllerBase + { + private readonly string _connectionString; private readonly ILogger _logger; - private readonly MembershipDbService _membershipDbService; - public MembershipController(ILogger logger, MembershipDbService membershipDbService) + public MembershipController(IConfiguration configuration, ILogger logger) { - _logger = logger; - _membershipDbService = membershipDbService; + string dbPwd = Environment.GetEnvironmentVariable("MARIADB_PASSWORD"); + string dbHost = Environment.GetEnvironmentVariable("MARIADB_SERVICE"); + _connectionString = $"Server={dbHost};Port=3306;Database=memberships;user=root;password={dbPwd}"; + _logger = logger; } - [HttpGet("{userid}", Name = "FindOne")] - public async Task> Get(int userid) + [HttpGet("{userid}")] + public async Task GetMembershipStatus(string userid) { - var result = await _membershipDbService.FindOne(userid); - if (result == default) + using (var connection = new MySqlConnection(_connectionString)) { - result = new MembershipEntity(userid, "FREE"); + _logger.LogInformation($"GET requested => userid: {userid}"); + + await connection.OpenAsync(); + + string selectQuery = "SELECT membership FROM membership WHERE userid = " + userid; + + + _logger.LogInformation($"Executing query: {selectQuery}"); + + using (var selectCmd = new MySqlCommand(selectQuery, connection)) + { + try + { + object result = await selectCmd.ExecuteScalarAsync(); + if (result != null) + { + _logger.LogInformation($@"Membership status of userid {userid}: {result}"); + return Ok(result); + } + else + { + _logger.LogInformation($"Membership status of userid {userid} not found"); + + // If no membership entry exists, insert a new one + string insertQuery = $@"INSERT INTO membership (userid, membership) VALUES ({userid}, ""FREE"")"; + using (var insertCmd = new MySqlCommand(insertQuery, connection)) + { + int rowsAffected = await insertCmd.ExecuteNonQueryAsync(); + if (rowsAffected > 0) + { + _logger.LogInformation($"Membership status for userid {userid} inserted as 'FREE'"); + return Ok("FREE"); + } + else + { + _logger.LogInformation($"Membership status for userid {userid} could not be inserted"); + return StatusCode((int)HttpStatusCode.InternalServerError); + } + } + } + } + catch (Exception ex) + { + return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message); + } + } } - return Ok(result); } - [HttpPost] - public async Task> Insert(MembershipEntity dto) + + [HttpPost("add/{userid}")] + public async Task SetMembershipStatus(string userid, [FromForm(Name = "membership")] string membership) { - try + using (var connection = new MySqlConnection(_connectionString)) { - var id = await _membershipDbService.Insert(dto); - if (id != null) - return id; - else - return BadRequest(); - } - catch(MySqlException e) - { - _logger.LogError(0, e, "Error while inserting membership"); - return StatusCode(500); + await connection.OpenAsync(); + + _logger.LogInformation($"INSERT requested => userid: {userid}, membership: {membership}"); + + string query = "INSERT INTO membership (userid, membership) VALUES (" + userid + ",\"" + membership + "\") ON DUPLICATE KEY UPDATE membership = \"" + membership + "\""; + + + _logger.LogInformation($"Executing query: {query}"); + + + using (var cmd = new MySqlCommand(query, connection)) + { + try + { + int rowsAffected = await cmd.ExecuteNonQueryAsync(); + if (rowsAffected > 0) + { + _logger.LogInformation($"Membership status for userid {userid} updated to {membership}"); + return Ok(); + } + else + { + _logger.LogInformation($"Membership status for userid {userid} could not be updated"); + return StatusCode((int)HttpStatusCode.InternalServerError); + } + } + catch (Exception ex) + { + return StatusCode((int)HttpStatusCode.InternalServerError, ex.Message); + } + } } - } + } + } } diff --git a/src/membership-service/Membership.cs b/src/membership-service/Membership.cs deleted file mode 100644 index d2031a7f..00000000 --- a/src/membership-service/Membership.cs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; - -namespace MembershipService -{ - public class Membership - { - public int? userid { get; set; } - - public string? subscription { get; set; } - } -} diff --git a/src/membership-service/MembershipService.csproj b/src/membership-service/MembershipService.csproj index 5073e3e0..265b74ed 100644 --- a/src/membership-service/MembershipService.csproj +++ b/src/membership-service/MembershipService.csproj @@ -7,9 +7,11 @@ - - - + + + + + diff --git a/src/membership-service/Persistence/DbInitializer.cs b/src/membership-service/Persistence/DbInitializer.cs deleted file mode 100644 index 6db7821a..00000000 --- a/src/membership-service/Persistence/DbInitializer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; -using System.Linq; - -namespace MembershipService.Persistence -{ - public static class DbInitializer - { - public static void Initialize(MariaDbContext context) - { - context.Database.EnsureCreated(); - } - } -} diff --git a/src/membership-service/Persistence/MariaDbContext.cs b/src/membership-service/Persistence/MariaDbContext.cs deleted file mode 100644 index da544342..00000000 --- a/src/membership-service/Persistence/MariaDbContext.cs +++ /dev/null @@ -1,36 +0,0 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MembershipService.Persistence -{ - public partial class MariaDbContext : Microsoft.EntityFrameworkCore.DbContext - { - public MariaDbContext(DbContextOptions options) : base(options) - { - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - => optionsBuilder.LogTo(Console.WriteLine, LogLevel.Information); - - public virtual DbSet membership { get; set; } - } -} diff --git a/src/membership-service/Persistence/MembershipDbService.cs b/src/membership-service/Persistence/MembershipDbService.cs deleted file mode 100644 index 48e2c0be..00000000 --- a/src/membership-service/Persistence/MembershipDbService.cs +++ /dev/null @@ -1,59 +0,0 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MembershipService.Persistence -{ - public sealed class MembershipDbService - { - private readonly MariaDbContext _dbContext; - - public MembershipDbService(MariaDbContext dbContext) - { - _dbContext = dbContext; - } - - public async Task FindOne(int userid) - { - string query = $@" - SELECT - userid, membership - FROM - membership - WHERE - userid={userid}"; - var res = await _dbContext.membership.FromSqlRaw(query).ToListAsync(); - return res.FirstOrDefault(); - } - - public async Task Insert(MembershipEntity membership) - { - string query = $@"INSERT INTO membership (userid,membership) VALUES ({membership.userid},""{membership.membership}"") ON DUPLICATE KEY UPDATE membership=""{membership.membership}"""; - var res = await _dbContext.Database.ExecuteSqlRawAsync(query); - if (res > 0) - { - var id = await _dbContext.membership.FromSqlRaw("SELECT userid, membership FROM membership WHERE userid=" + membership.userid).ToListAsync(); - return id.FirstOrDefault(); - } - return null; - } - } -} diff --git a/src/membership-service/Persistence/MembershipEntity.cs b/src/membership-service/Persistence/MembershipEntity.cs deleted file mode 100644 index 100c738e..00000000 --- a/src/membership-service/Persistence/MembershipEntity.cs +++ /dev/null @@ -1,40 +0,0 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace MembershipService.Persistence -{ - public class MembershipEntity - { - public MembershipEntity() - { - } - - public MembershipEntity(int id, string membershipText) - { - userid = id; - membership = membershipText; - } - - [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] - public int? userid { get; set; } - - public string membership { get; set; } - } -} diff --git a/src/membership-service/Program.cs b/src/membership-service/Program.cs index 6bc0a0d6..f261363e 100644 --- a/src/membership-service/Program.cs +++ b/src/membership-service/Program.cs @@ -1,28 +1,9 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using MembershipService.Persistence; +using MySql.Data.MySqlClient; namespace MembershipService { @@ -30,36 +11,75 @@ public class Program { public static void Main(string[] args) { - var host = CreateHostBuilder(args).Build(); - CreateDbIfNotExists(host); - host.Run(); + CreateHostBuilder(args).Build().Run(); } - private static void CreateDbIfNotExists(IHost host) + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + webBuilder.UseUrls("http://*:" + Environment.GetEnvironmentVariable("SERVER_PORT")); + }) + .ConfigureServices((hostContext, services) => + { + string dbPwd = Environment.GetEnvironmentVariable("MARIADB_PASSWORD"); + string dbHost = Environment.GetEnvironmentVariable("MARIADB_SERVICE"); + var connectionString = $"Server={dbHost};Port=3306;Database=memberships;user=root;password={dbPwd}"; + + // Check if MariaDB exists, if not, create it + using (var connection = new MySqlConnection(connectionString)) + { + try + { + connection.Open(); + } + catch (MySqlException) + { + // Database does not exist, create it + CreateMariaDBDatabase(connectionString); + } + } + }); + + private static void CreateMariaDBDatabase(string connectionString) { - using (var scope = host.Services.CreateScope()) + var builder = new MySqlConnectionStringBuilder(connectionString); + string databaseName = builder.Database; + + // Connection string without database name + builder.Database = string.Empty; + string masterConnectionString = builder.ConnectionString; + + using (var masterConnection = new MySqlConnection(masterConnectionString)) { - var services = scope.ServiceProvider; - try + masterConnection.Open(); + + // Create database + using (var command = masterConnection.CreateCommand()) { - var context = services.GetRequiredService(); - DbInitializer.Initialize(context); + command.CommandText = $"CREATE DATABASE IF NOT EXISTS `{databaseName}`"; + command.ExecuteNonQuery(); } - catch (Exception ex) + + // After creating the database, create the necessary table + using (var connection = new MySqlConnection(connectionString)) { - var logger = services.GetRequiredService>(); - logger.LogError(ex, "An error occurred creating the DB."); - System.Environment.Exit(1); + connection.Open(); + + // Create table + using (var command = connection.CreateCommand()) + { + command.CommandText = @" + CREATE TABLE IF NOT EXISTS `membership` ( + `userid` VARCHAR(50) PRIMARY KEY, + `membership` VARCHAR(100) + )"; + command.ExecuteNonQuery(); + } } + } } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - webBuilder.UseUrls("http://*:" + Environment.GetEnvironmentVariable("SERVER_PORT")); - }); } } diff --git a/src/membership-service/README.md b/src/membership-service/README.md index 61d670f1..d852cf58 100644 --- a/src/membership-service/README.md +++ b/src/membership-service/README.md @@ -63,13 +63,10 @@ docker run -it -p 80:8083 --name membership-service-container membership-service Returns the current membership of the requested user ID. -#### POST /membership-service +#### POST /membership-service/add/{userid} -Insert or update the current membership of the user ID specified in the HTTP body: +Update the user membership by providing it as simple form params to the post request: -```json -{ - "userid": 234145, - "membership": "PRO" -} +``` +membership={membershipText} ``` diff --git a/src/membership-service/Startup.cs b/src/membership-service/Startup.cs index 6df8f672..cc45bfca 100644 --- a/src/membership-service/Startup.cs +++ b/src/membership-service/Startup.cs @@ -1,69 +1,34 @@ -// -// Copyright 2023 Dynatrace LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using MembershipService.Persistence; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.HttpsPolicy; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Pomelo.EntityFrameworkCore.MySql.Infrastructure; namespace MembershipService { public class Startup { + public IConfiguration Configuration { get; } + public Startup(IConfiguration configuration) { Configuration = configuration; } - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { - string dbPwd = Environment.GetEnvironmentVariable("MARIADB_PASSWORD"); - string dbHost = Environment.GetEnvironmentVariable("MARIADB_SERVICE"); - string connectString = $"Server={dbHost};Port=3306;Database=memberships;user=root;password={dbPwd}"; - services.AddDbContext( - options => options.UseMySql( - connectString, - new MySqlServerVersion(new Version(10, 5, 8)), - options => options.EnableRetryOnFailure( - maxRetryCount: 10, - maxRetryDelay: System.TimeSpan.FromSeconds(60), - errorNumbersToAdd: null) - ) - ); - - services.AddScoped(); - + services.AddCors(options => + { + options.AddPolicy("AllowOrigin", builder => + { + builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); services.AddControllers(); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) @@ -73,6 +38,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRouting(); + app.UseCors("AllowOrigin"); + app.UseEndpoints(endpoints => { endpoints.MapControllers(); From 09d6fe69b603a9d92df03f80518f6da371580518 Mon Sep 17 00:00:00 2001 From: Fabian Oraze Date: Mon, 13 May 2024 16:07:14 +0200 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=94=A7=20feat(frontend):=20Change=20f?= =?UTF-8?q?rontend=20to=20send=20adapted=20POST=20requests=20to=20the=20me?= =?UTF-8?q?mbership=20service?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/site.js | 38 +++++++++++++++++++++++-------- src/frontend/views/membership.njk | 5 ++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/frontend/site.js b/src/frontend/site.js index 1f9cdbe1..62561d2f 100644 --- a/src/frontend/site.js +++ b/src/frontend/site.js @@ -24,6 +24,7 @@ const adManagerRouter = require('./controller/adManager'); const cheerio = require('cheerio'); const express = require('express'); const router = express.Router(); +const querystring = require('querystring'); // Global Timeline route router.get('/', showGlobalTimeline); @@ -71,7 +72,7 @@ function showGlobalTimeline(req, res) { username: getJwtUser(req.cookies), isAdManager: hasJwtRole(req.cookies, roles.AD_MANAGER), baseData: baseRequestFactory.baseData, - membership: membership.data.membership + membership: membership.data }, req); res.render('index.njk', data) @@ -109,7 +110,7 @@ function showUsers(req, res) { username: getJwtUser(req.cookies), isAdManager: hasJwtRole(req.cookies, roles.AD_MANAGER), baseData: baseRequestFactory.baseData, - membership: membership.data.membership + membership: membership.data }, req); res.render('users.njk', data); @@ -130,7 +131,7 @@ function showPersonalTimeline(req, res) { username: getJwtUser(req.cookies), isAdManager: hasJwtRole(req.cookies, roles.AD_MANAGER), baseData: baseRequestFactory.baseData, - membership: membership.data.membership + membership: membership.data }, req); res.render('index.njk', data); }, (err) => displayError(err, res)) @@ -154,7 +155,7 @@ function showUserProfile(req, res) { isAdManager: hasJwtRole(req.cookies, roles.AD_MANAGER), bio: bioText, baseData: baseRequestFactory.baseData, - membership: membership.data.membership + membership: membership.data }, req); res.render('profile.njk', data); @@ -189,7 +190,7 @@ function showMembership(req, res) { username: getJwtUser(req.cookies), isAdManager: hasJwtRole(req.cookies, roles.AD_MANAGER), baseData: baseRequestFactory.baseData, - membership: membership.data.membership + membership: membership.data }, req); res.render('membership.njk', data); @@ -373,11 +374,28 @@ function unlikePost(req, res) { } function postMembership(req, res) { - const membership = {userid: getJwtUserId(req.cookies), membership: req.body.membershipText}; - fetchUsingDeploymentBase(req, () => req.MEMBERSHIP_SERVICE_API.post('/', membership)).then((response) => { - res.redirect(extendURL(`/user/${getJwtUser(req.cookies)}`)); - }, (error) => res.status(statusCodeForError(error)).render('error.njk', handleError(error))); - + const formData = { + membership: req.body.membershipText, + }; + fetchUsingDeploymentBase(req, () => + req.MEMBERSHIP_SERVICE_API.post( + `/add/${getJwtUserId(req.cookies)}`, + querystring.stringify(formData), + { + headers: { + "Content-Type": "application/x-www-form-urlencoded", + }, + } + ) + ).then( + (response) => { + res.redirect(extendURL(`/user/${getJwtUser(req.cookies)}`)); + }, + (error) => + res + .status(statusCodeForError(error)) + .render("error.njk", handleError(error)) + ); } function postBio(req, res) { diff --git a/src/frontend/views/membership.njk b/src/frontend/views/membership.njk index e3b429ee..f5d34d31 100644 --- a/src/frontend/views/membership.njk +++ b/src/frontend/views/membership.njk @@ -1,4 +1,4 @@ -{# +{# Copyright 2023 Dynatrace LLC Licensed under the Apache License, Version 2.0 (the "License"); @@ -48,6 +48,7 @@ limitations under the License. +
@@ -66,6 +67,6 @@ limitations under the License. Update membership plan - +
{% endblock %} From 192b1ae8ddd1023c4b542643e6d99a6dbd1ae082 Mon Sep 17 00:00:00 2001 From: Fabian Oraze Date: Tue, 14 May 2024 09:32:34 +0200 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=94=A7=20feat(membership-service):=20?= =?UTF-8?q?Implement=20PR=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/MembershipController.cs | 18 ++++++++++++++++-- src/membership-service/Program.cs | 16 ++++++++++++++++ src/membership-service/README.md | 2 +- src/membership-service/Startup.cs | 18 ++++++++++++++++-- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/src/membership-service/Controllers/MembershipController.cs b/src/membership-service/Controllers/MembershipController.cs index 41d31f1c..771306d9 100644 --- a/src/membership-service/Controllers/MembershipController.cs +++ b/src/membership-service/Controllers/MembershipController.cs @@ -1,3 +1,19 @@ +// +// Copyright 2024 Dynatrace LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + using System; using System.Data; using System.Net; @@ -36,7 +52,6 @@ public async Task GetMembershipStatus(string userid) string selectQuery = "SELECT membership FROM membership WHERE userid = " + userid; - _logger.LogInformation($"Executing query: {selectQuery}"); using (var selectCmd = new MySqlCommand(selectQuery, connection)) @@ -91,7 +106,6 @@ public async Task SetMembershipStatus(string userid, [FromForm(Na string query = "INSERT INTO membership (userid, membership) VALUES (" + userid + ",\"" + membership + "\") ON DUPLICATE KEY UPDATE membership = \"" + membership + "\""; - _logger.LogInformation($"Executing query: {query}"); diff --git a/src/membership-service/Program.cs b/src/membership-service/Program.cs index f261363e..d818a397 100644 --- a/src/membership-service/Program.cs +++ b/src/membership-service/Program.cs @@ -1,3 +1,19 @@ +// +// Copyright 2024 Dynatrace LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + using System; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; diff --git a/src/membership-service/README.md b/src/membership-service/README.md index d852cf58..7644641e 100644 --- a/src/membership-service/README.md +++ b/src/membership-service/README.md @@ -65,7 +65,7 @@ Returns the current membership of the requested user ID. #### POST /membership-service/add/{userid} -Update the user membership by providing it as simple form params to the post request: +Update the user membership by providing it as simple form parameter to the post request: ``` membership={membershipText} diff --git a/src/membership-service/Startup.cs b/src/membership-service/Startup.cs index cc45bfca..57b857c9 100644 --- a/src/membership-service/Startup.cs +++ b/src/membership-service/Startup.cs @@ -1,3 +1,19 @@ +// +// Copyright 2024 Dynatrace LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; @@ -38,8 +54,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseRouting(); - app.UseCors("AllowOrigin"); - app.UseEndpoints(endpoints => { endpoints.MapControllers();