|
namespace TimeIntervalExample
{
using System;
using FogCreek.FogBugz;
using FogCreek.FogBugz.Database.Entity;
using FogCreek.FogBugz.Plugins;
using FogCreek.FogBugz.Plugins.Api;
using FogCreek.FogBugz.Plugins.Entity;
using FogCreek.FogBugz.Plugins.Interfaces;
public class TimeIntervalExample : Plugin, IPluginTimeIntervalJoin, IPluginJS, IPluginDatabase, IPluginRawPageDisplay
{
private const string sPluginId = "Adam+TimeIntervalExample@fogcreek.com";
private const string CommentsTable = "TimeIntervalComment";
private const string IntervalColumn = "ixInterval";
private const string CommentColumn = "sComment";
public const int CommentColumnMaxLength = 255;
private const int PluginSchemaVer = 1;
public TimeIntervalExample(CPluginApi api)
: base(api)
{
}
#region IPluginTimeIntervalJoin
public string[] TimeIntervalJoinTables()
{
return new[] { CommentsTable };
}
#endregion
#region IPluginJS Members
/// <summary>
/// Javascript is used to augment the time-tracking UI to display and edit comments
/// </summary>
/// <returns>new instance configured with list of JScript file references to emit</returns>
public CJSInfo JSInfo()
{
const string trackerObjectFormat = @"
var TrackerCommentsPlugIn = {{
plugInRawPageUrl: '{0}',
pluginPrefix: '{1}',
PostTimeFunctionToken: '{2}',
UpdateCommentFunctionToken: '{3}',
TimeIntervalForeignKeyColumnName: '{4}'
}};";
var jsInfo = new CJSInfo
{
rgsStaticFiles = new[] {"js/TimeIntervalExample.js"},
sInlineJS = string.Format(trackerObjectFormat,
api.Url.PluginRawPageUrl(),
api.PluginPrefix,
api.Security.GetActionToken("saveTimeIntervalComment"),
api.Security.GetActionToken("updateCommentText"),
IntervalColumn)
};
return jsInfo;
}
#endregion
#region IPluginDatabase Members
/// <summary>
/// Schema Definition
/// </summary>
/// <returns>
/// Array with one element representing the comments table
/// </returns>
public CTable[] DatabaseSchema()
{
var timeIntervalComments = api.Database.NewTable(api.Database.PluginTableName(CommentsTable));
timeIntervalComments.sDesc = "Assigns Comments to TimeIntervals";
timeIntervalComments.AddAutoIncrementPrimaryKey("ixTimeIntervalComment");
timeIntervalComments.AddIntColumn(IntervalColumn, true, 0);
timeIntervalComments.AddVarcharColumn(CommentColumn, CommentColumnMaxLength, false);
return new[] { timeIntervalComments };
}
/// <summary>
/// Returns Database Plugin Schema Version
/// </summary>
/// <returns>
/// Integer with database schema version
/// </returns>
public int DatabaseSchemaVersion()
{
return PluginSchemaVer;
}
public void DatabaseUpgradeAfter(int ixVersionFrom, int ixVersionTo, CDatabaseUpgradeApi apiUpgrade)
{
if (ixVersionTo == 1)
{
// No action required. Don't create any data in the tables
}
}
public void DatabaseUpgradeBefore(int ixVersionFrom, int ixVersionTo, CDatabaseUpgradeApi apiUpgrade)
{
if (ixVersionTo == 1)
{
// No action required. Don't create any data in the tables
}
}
#endregion
#region IPluginRawPageDisplay Members
/// <summary>
/// Portion of FogBugz API Interface which generates a completely empty page. In our case, this empty page will never be seen
/// by the user. Its only purpose is to provide a URL which AJAX calls can target and the page can then processes these calls.
/// </summary>
public string RawPageDisplay()
{
if (api.Request[api.AddPluginPrefix("action")] != null &&
Convert.ToString(api.Request[api.AddPluginPrefix("action")]) == "saveTimeIntervalComment")
{
// make sure the request includes a valid action token
if ((api.Request[api.AddPluginPrefix("actionToken")] == null) ||
!api.Security.ValidateActionToken(api.Request[api.AddPluginPrefix("actionToken")], "saveTimeIntervalComment"))
{
return "!!Failure!!: action token invalid";
}
else
{
int ixInterval = -1;
string sComment = "";
if (api.Request[api.AddPluginPrefix("ixInterval")] != null &&
Int32.TryParse(Convert.ToString(api.Request[api.AddPluginPrefix("ixInterval")]), out ixInterval))
{
if (api.Request[api.AddPluginPrefix("sComment")] != null)
{
sComment = api.Request[api.AddPluginPrefix("sComment")];
}
//If all error checks pass, post the user's inputted comment to the database.
return SaveCommentToDb(ixInterval, sComment);
}
else
{
return "!!Failure!!: invalid ixInterval";
}
}
}
else if (api.Request[api.AddPluginPrefix("action")] != null && Convert.ToString(api.Request[api.AddPluginPrefix("action")]) == "updateCommentText")
{
int ixInterval = -1;
if (api.Request[api.AddPluginPrefix("ixInterval")] != null &&
Int32.TryParse(Convert.ToString(api.Request[api.AddPluginPrefix("ixInterval")]), out ixInterval))
{
//If all error checks pass, retrieve the comment specific to the time interval index.
return GetCommentFromDb(ixInterval);
}
else
{
return "!!Failure!!: ixInterval invalid";
}
}
else
{
return "!!Failure!!: command not recognized";
}
}
/// <summary>
/// Portion of FogBugz API Interface which sets the permission level of
/// the empty pages used by the RawPageDisplay method.
/// </summary>
public PermissionLevel RawPageVisibility()
{
return PermissionLevel.Normal;
}
#endregion
/// <summary>
/// Posts the timeinterval and comment pair into the database
/// </summary>
/// <returns>
/// Returns a string to confirm the the database posting was successful
/// </returns>
private string SaveCommentToDb (int ixInterval, string sComment)
{
CTimeIntervalQuery query = api.TimeInterval.NewTimeIntervalQuery();
query.AddWhere("TimeInterval.ixInterval = @ixInterval");
query.SetParamInt("@ixInterval", ixInterval);
CTimeInterval[] rgTimeIntervals = query.List();
if (rgTimeIntervals.Length > 0)
{
CTimeInterval interval = rgTimeIntervals[0];
interval.SetPluginField(sPluginId, "sComment", sComment);
interval.Commit();
}
return "success: '" + sComment + "' recorded for interval #" + ixInterval;
}
/// <summary>
/// Retrieves the comment for the specified time interval index.
/// </summary>
/// <returns>
/// Returns a string with the comment contained within.
/// </returns>
private string GetCommentFromDb (int ixInterval)
{
string sComment = String.Empty;
CTimeIntervalQuery query = api.TimeInterval.NewTimeIntervalQuery();
query.AddWhere("TimeInterval.ixInterval = @ixInterval");
query.SetParamInt("@ixInterval", ixInterval);
CTimeInterval[] rgTimeIntervals = query.List();
if (rgTimeIntervals.Length > 0)
{
object oComment = rgTimeIntervals[0].GetPluginField(sPluginId, "sComment");
if (oComment != null)
{
sComment = oComment.ToString();
}
}
return sComment;
}
}
}
|
Loading...