diff --git a/src/Project/Controllers/ProjectController.cs b/src/Project/Controllers/ProjectController.cs index 30a2413c22962701cc3b28db18a070a2198ca0d3..65f95e6f96c9359adccbbcc3c42ae2007153d983 100644 --- a/src/Project/Controllers/ProjectController.cs +++ b/src/Project/Controllers/ProjectController.cs @@ -115,7 +115,7 @@ namespace Coscine.Api.Project.Controllers var project = _projectModel.GetById(Guid.Parse(id)); if (_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner)) { - SubProjectModel subProjectModel = new SubProjectModel(); + var subProjectModel = new SubProjectModel(); var subProjectRel = subProjectModel.GetAllWhere((subProject) => subProject.SubProjectId == project.Id && !project.Deleted); var parentProjectRelation = subProjectRel.FirstOrDefault(); @@ -422,6 +422,12 @@ namespace Coscine.Api.Project.Controllers projectQuotaForCurrent.Quota = updateProjectQuotaObject.Allocated; _projectQuotaModel.Update(projectQuotaForCurrent); } + + if (Request.Query != null && Request.Query["noanalyticslog"] != "true") + { + LogAnalyticsOwnerProjectQuotaChange(project, user); + } + return NoContent(); } @@ -652,6 +658,33 @@ namespace Coscine.Api.Project.Controllers return new ActionResult<IEnumerable<InvitationReturnObject>>(invitations); } + /// <summary> + /// Call to analytics logger. + /// </summary> + /// <param name="projectId">Project id of the project</param> + /// <returns>204 no content</returns> + [HttpGet("[controller]/{projectId}/-/create-profile")] + public IActionResult CreateApplicationProfile(Guid projectId) + { + var project = _projectModel.GetById(projectId); + + if (project == null) + { + return NotFound($@"The project ""{projectId}"" was not found."); + } + + var user = _authenticator.GetUser(); + + if (!_projectModel.HasAccess(user, project, UserRoles.Owner)) + { + return Unauthorized("You are not an owner of the project."); + } + + LogAnalyticsCreateApplicationProfile(project, user); + + return NoContent(); + } + /// <summary> /// Create and send an invitation to specified mail. /// </summary> @@ -721,6 +754,11 @@ namespace Coscine.Api.Project.Controllers NotificationBusUtil.Send(Program.Configuration, "user_invitation", NotificationBusUtil.GetUserList(new User { EmailAddress = sendInvitationObject.Email }), sendInvitationObject.Project.ToString(), body); + if (Request.Query != null && Request.Query["noanalyticslog"] != "true") + { + LogAnalyticsInviteExternalUser(project, user); + } + return NoContent(); } @@ -914,5 +952,50 @@ namespace Coscine.Api.Project.Controllers Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null, }); } + + private void LogAnalyticsOwnerProjectQuotaChange(Database.DataModel.Project project, User user) + { + var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled == true); + + var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id)); + + _coscineLogger.AnalyticsLog( + new AnalyticsLogObject + { + Type = "Action", + Operation = "Owner Project Quota Change", + RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(), + ProjectId = project.Id.ToString(), + QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList() + }); + } + + private void LogAnalyticsInviteExternalUser(Database.DataModel.Project project, User user) + { + var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled == true); + + var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id)); + + _coscineLogger.AnalyticsLog( + new AnalyticsLogObject + { + Type = "Action", + Operation = "Invite External User", + RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(), + ProjectId = project.Id.ToString() + }); + } + + private void LogAnalyticsCreateApplicationProfile(Database.DataModel.Project project, User user) + { + _coscineLogger.AnalyticsLog( + new AnalyticsLogObject + { + Type = "Action", + Operation = "Create Application Profile", + RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(), + ProjectId = project.Id.ToString() + }); + } } -} +} \ No newline at end of file