Hi everyone!
I am trying to extend the OneIdentity API for file upload. (I am using v9.2)
I was able to extend the API with some basic functionality, but I am struggling to add the file upload functionality.
I get errors like:
"Severity Code Description Project File Line Suppression State Error CS1061 'IRequest' does not contain a definition for 'FileName' and no accessible extension method 'FileName' accepting a first argument of type 'IRequest' could be found (are you missing a using directive or an assembly reference?) UnitePlugin.CompositionAPI.Server.Plugin "
It seems like the IRequest doesn't contain FileName. Can I use anything else, or maybe use a different approach?
Any help would be appreciated.
Here's the basic code:
using QBM.CompositionApi.ApiManager; using QBM.CompositionApi.Definition; using QER.CompositionApi.Portal; using VI.DB.Entities; using VI.DB.Scripting; using System.Collections.Generic; using System.Collections; using NLog; using VI.Base; using System; namespace UnitePlugin.CompositionApi.Api { //P.S. Class implementing IApiProviderFor<QER.CompositionApi.Portal.PortalApiProject> //will be included in the "Portal" project. //This way we can extend portal project with custom methods //and user's login to portal will work with this plugin. public class MyMethods : IApiProviderFor<QER.CompositionApi.Portal.PortalApiProject>, IApiProvider { public void Build(IApiBuilder builder) { builder.AddMethod(Method.Define("uniteplugin/getreportsrolesscript/{centralaccount}") .WithParameter("centralaccount", typeof(string), isInQuery: false) .HandleGet(qr => { //var allow = qr.Route.Method.Settings.AllowUnauthenticated; // Setup the script runner var scriptClass = qr.Session.Scripts().GetScriptClass(ScriptContext.Scripts); var runner = new ScriptRunner(scriptClass, qr.Session); // Add any script input parameters to this array. // In this example, the script parameters are defined as // URL parameters, and their values must be supplied // by the client. This does not have to be the case. var parameters = new object[] { qr.Parameters.Get<string>("centralaccount") }; // This assumes that the script returns a string. var ret = runner.Eval("CCC_Call_Database_Direct", parameters); return System.Threading.Tasks.Task.FromResult(ret); })); builder.AddMethod(Method.Define("uniteplugin/getreportsrolessql/{centralaccount}") //.AllowUnauthenticated() // Insert the statement name (QBMLimitedSQL.Ident_QBMLimitedSQL) and the type .HandleGetBySqlStatement("CCC_Get_Reports_With_Business_Roles", SqlStatementType.SqlExecute) .WithParameter("centralaccount", typeof(string), isInQuery: false) // Define the result schema columns and data types //CentralAccount, FirstName, LastName, Title, Ident_Org .WithResultColumns( new SqlResultColumn("CentralAccount", ValType.String), new SqlResultColumn("FirstName", ValType.Int), new SqlResultColumn("LastName", ValType.Int), new SqlResultColumn("Title", ValType.Int), new SqlResultColumn("Ident_Org", ValType.Int) ) ); builder.AddMethod(Method.Define("uniteplugin/averageapptovaltime/{daysToCheck}") //.AllowUnauthenticated() // Insert the statement name (QBMLimitedSQL.Ident_QBMLimitedSQL) and the type .HandleGetBySqlStatement("CCC_Average_Approval_Time", SqlStatementType.SqlExecute) .WithParameter("daysToCheck", typeof(int), isInQuery: false) // Define the result schema columns and data types //DisplayPersonOrdered, OrderDate, DisplayOrg, OrderState,OrderStateDisplay, UserAverage, OrgAverageMinutes, GlobalAverageMinutes .WithResultColumns( new SqlResultColumn("DisplayPersonOrdered", ValType.String), new SqlResultColumn("OrderDate", ValType.Int), new SqlResultColumn("DisplayOrg", ValType.Int), new SqlResultColumn("OrderState", ValType.Int), new SqlResultColumn("OrderStateDisplay", ValType.Int), new SqlResultColumn("UserAverage", ValType.Int), new SqlResultColumn("OrgAverageMinutes", ValType.Int), new SqlResultColumn("GlobalAverageMinutes", ValType.Int) ) ); } } }
Here's the code I tried to add to it:
builder.AddMethod(Method.Define("sampleplugin/upload") .Handle("POST", async (file, qr) => { // Handle the uploaded file here string fileName = file.FileName; byte[] fileBytes = await file.ReadAllBytesAsync(); // Save the file or perform other operations as needed // Example: Save to disk string filePath = Path.Combine("Uploads", fileName); File.WriteAllBytes(filePath, fileBytes); // Return a response return new DataObject { Message = "File uploaded successfully: " + fileName }; }));