//******************************************************************************************************
// ClaimAttribute.cs - Gbtc
//
// Copyright © 2021, Grid Protection Alliance. All Rights Reserved.
//
// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
// the NOTICE file distributed with this work for additional information regarding copyright ownership.
// The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
// file except in compliance with the License. You may obtain a copy of the License at:
//
// http://opensource.org/licenses/MIT
//
// Unless agreed to in writing, the subject software distributed under the License is distributed on an
// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
// License for the specific language governing permissions and limitations.
//
// Code Modification History:
// ----------------------------------------------------------------------------------------------------
// 09/22/2021 - Billy Ernest
// Generated original version of source code.
//
//******************************************************************************************************
using System;
using System.Linq;
using System.Security.Claims;
namespace GSF.Data.Model
{
///
/// Defines an attribute that will allow setting claims for function roles for a modeled table in GSF.Web.Model.ModelController.
///
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public sealed class ClaimAttribute : Attribute
{
///
/// Gets Claim to use for property.
///
public Claim Claim { get; }
///
/// Get Verb to use for property
///
public string Verb { get; }
///
/// Creates a new for use in GSF.Web.Model.ModelController"/>.
///
/// HTTP verbs of GET, POST, PATCH, or DELETE.
/// Type of claim, use specific .
/// value of the claim.
public ClaimAttribute(string verb, string type, string value)
{
string[] verbs = new string[] { "GET", "POST", "PATCH", "DELETE" };
Verb = verb.ToUpper();
if (!verbs.Any(v => v == Verb))
throw new Exception("Incorrect verbs used in defining model claims, please use GET, POST, PATCH, or DELETE");
string[] claimTypes = typeof(ClaimTypes).GetFields().Where(x => x.FieldType.FullName == "System.String").Select(field => typeof(ClaimTypes).GetField(field.Name).GetRawConstantValue().ToString()).ToArray();
if (!claimTypes.Any(c => c == type))
throw new Exception("Incorrect type used in defining model type, please use specific System.Security.Claims.ClaimTypes when defining claims");
Claim = new Claim(type, value);
}
}
}