You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mchsamples-.net-core/AlertSoftwareKit/AlertWebAPI/Controllers/AlertController.cs

273 lines
10 KiB

// ========================================================================
//
// Copyright (C) 2017-2018 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : AlertController.cs
// Author : Marc Chevaldonné
// Creation date : 2018-02-12
//
// ========================================================================
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using AlertWebAPI.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
//using Microsoft.Azure.NotificationHubs;
//using Microsoft.Azure.Mobile.Server.Config;
//using Microsoft.Azure.Mobile.Server;
namespace AlertWebAPI.Controllers
{
/// <summary>
/// controller to access the "alerts" database through the web service
/// </summary>
[Authorize] //"authorize" does not allow anonymous use of the public methods of AlertController
[Route("api/alert")]
public class AlertController : Controller
{
/// <summary>
/// context to the EntityFramework "alerts" database
/// </summary>
private readonly AlertDbContext context;
/// <summary>
/// constructor that will be automatically called by the web api when needed
/// </summary>
/// <param name="context">context to the EntityFramework database</param>
public AlertController(AlertDbContext context)
{
this.context = context;
//fills the database with stubbed data if it is empty
StubData(context);
}
//[Conditional("DEBUG")]
private void StubData(AlertDbContext context)
{
if (context.AlertItems.Count() == 0)
{
InitializeData(context);
context.SaveChanges();
}
}
/// <summary>
/// adds three fake alerts to the database
/// </summary>
/// <param name="context"></param>
private void InitializeData(AlertDbContext context)
{
context.AlertItems.Add(new AlertItem
{
Id = new Guid("D61C83CA-1BFB-43EB-A952-C0364D77E40F"),
Name = "Alert 1",
Date = new DateTime(2018, 2, 4, 22, 53, 00),
Decription = "une petite alerte...",
Type = AlertType.Low,
IsManaged = false,
SignaledBy = "Dwight Schrute"
});
context.AlertItems.Add(new AlertItem
{
Id = new Guid("9E1F9662-02C0-435C-8027-0062BAB38143"),
Name = "Alert 2",
Date = new DateTime(2018, 2, 4, 22, 55, 00),
Decription = "une alerte...",
Type = AlertType.Medium,
IsManaged = false,
SignaledBy = "Dwight Schrute"
});
context.AlertItems.Add(new AlertItem
{
Id = new Guid("371E0CBC-F339-433B-8629-3C5A38DC2822"),
Name = "Alert 3",
Date = new DateTime(2018, 2, 4, 22, 56, 00),
Decription = "une grosse alerte...",
Type = AlertType.High,
IsManaged = false,
SignaledBy = "Dwight Schrute"
});
context.AlertItems.Add(new AlertItem
{
Id = new Guid("79CEF2C8-4CC6-4A95-8DA8-B00DEDB5E3A8"),
Name = "Alert 4",
Date = new DateTime(2018, 3, 5, 17, 11, 00),
Decription = "une alerte de ouf...",
Type = AlertType.High,
IsManaged = false,
SignaledBy = "Michael Scott"
});
}
/// <summary>
/// gets all the alerts in the database
/// GET: api/<controller>
/// </summary>
/// <returns>a collection of alerts</returns>
[HttpGet]
public IEnumerable<AlertItem> GetAll()
{
return context.AlertItems.ToList();
}
//the previous method could have used IActionResult as a return parameter
//IActionResult allows methods to have different methods to use (NotFound, ObjectResult, BadRequest, NoContentResult, Ok...)
//[HttpGet]
//public IActionResult GetAll()
//{
// return new ObjectResult(context.AlertItems.ToList());
//}
/// <summary>
/// get an alert by giving its id
/// GET api/<controller>/5
/// {id} indicates the part of the request representing the id
/// </summary>
/// <param name="id">the id of the alert to get</param>
/// <returns>the alert owning this id or null</returns>
[HttpGet("{id}", Name = "GetAlert")]
public IActionResult GetById(Guid id)
{
var alertItem = context.AlertItems.FirstOrDefault(alert => alert.Id == id);
if(alertItem == null)
{
return NotFound();
}
return new ObjectResult(alertItem);
}
/// <summary>
/// a post request allows to add a new alert in the database
/// POST api/<controller>
/// </summary>
/// <param name="alert">the alert to add</param>
/// <returns></returns>
[HttpPost]
public IActionResult Post([FromBody]AlertItem alert)
{
//returns a BadRequest if the alert to add is null
if (alert == null)
{
return BadRequest();
}
//adds the alert to the database
context.AlertItems.Add(alert);
context.SaveChanges();
//await PushMethode(alert);
//returns the route allowing to access this alert
//the route is defined as "GetAlert", defined in the previous methode GetById
return CreatedAtRoute("GetAlert", new { id = alert.Id }, alert);
}
//private async System.Threading.Tasks.Task PushMethode(AlertItem alert)
//{
// //// Get the settings for the server project.
// //System.Web.Http.HttpConfiguration config = this.Configuration;
// //MobileAppSettingsDictionary settings =
// // this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
// //// Get the Notification Hubs credentials for the mobile app.
// //string notificationHubName = settings.NotificationHubName;
// //string notificationHubConnection = settings
// // .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
// // Create a new Notification Hub client.
// NotificationHubClient hub = NotificationHubClient
// //.CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
// .CreateClientFromConnectionString(@"Endpoint=sb://alertsetsis.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=T83QPDWgowEYoQYMyWvKSJte1/wMsiE8Opa0RCK8AZs=",
// "alertsetsisnotificationhub");
// // Send the message so that all template registrations that contain "messageParam"
// // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
// Dictionary<string, string> templateParams = new Dictionary<string, string>();
// templateParams["messageParam"] = $"new alert: {alert.Name}";//item.Text + " was added to the list.";
// try
// {
// // Send the push notification and log the results.
// var result = await hub.SendTemplateNotificationAsync(templateParams);
// // Write the success result to the logs.
// //config.Services.GetTraceWriter().Info(result.State.ToString());
// }
// catch (System.Exception ex)
// {
// // Write the failure result to the logs.
// //config.Services.GetTraceWriter()
// // .Error(ex.Message, null, "Push.SendAsync Error");
// }
//}
/// <summary>
/// updates an alert
/// PUT api/<controller>/5
/// </summary>
/// <param name="id">the id of the alert to update</param>
/// <param name="item">the alert to update</param>
/// <returns></returns>
[HttpPut("{id}")]
public IActionResult Put(Guid id, [FromBody]AlertItem item)
{
//returns a BadRequest if the alert is null or does not have the good id
if (item == null || item.Id != id)
{
return BadRequest();
}
//gets the alert in the database with the given id
var alert = context.AlertItems.FirstOrDefault(a => a.Id == id);
if (alert == null)
{
return NotFound();
}
//updates the alert
alert.Date = item.Date;
alert.Decription = item.Decription;
alert.IsManaged = item.IsManaged;
alert.ManagedBy = item.ManagedBy;
alert.Name = item.Name;
alert.SignaledBy = item.SignaledBy;
alert.Type = item.Type;
context.AlertItems.Update(alert);
context.SaveChanges();
return new NoContentResult();
}
/// <summary>
/// deletes an alert in the database
/// DELETE api/<controller>/5
/// </summary>
/// <param name="id">the id of the alert to delete</param>
/// <returns></returns>
[HttpDelete("{id}")]
public IActionResult Delete(Guid id)
{
//retrieves the alert to delete in the database
var alertItem = context.AlertItems.FirstOrDefault(a => a.Id == id);
if (alertItem == null)
{
return NotFound();
}
//removes it from the database
context.AlertItems.Remove(alertItem);
context.SaveChanges();
return new NoContentResult();
}
}
}