How to Manage Work Items Using Visual Studio Online REST API

TFS online as a part of Visual Studio Online ( VSO )  stays more and more popular solution for source control , backlog items management ( in the context of scrum and kanban ) , build system etc. Often software companies need to integrate work items management with other systems ( project management, billing etc.)

In the series of several blogs I will try to share my experience how to manage Visual Studio Programmatically.

In this article we will learn how to start to manage programmatically work items in Visual Studio Online. To do that you can use the VSO REST API calling it’s methods from any platform/language . Sometimes it is overhead to create own library to work with Visual Studio Online REST API. In this situation if you are using .NET / C# the best solution is just to use  Visual Studio Online REST API in codeplex .

Visual Studio Online REST API is a C# library for using TFS REST API in your .NET applications. Current version supports:

  • Projects and teams
  • Areas and iterations
  • Work item
  • Query and query folder
  • Version Control
  • Git
  • Build

This post is mainly focused on how to work with work items:

  • Create / update / read work items
  • Add / remove work item links and attachments
  • Create / update / delete tags

Before to start manage work items using Visual Studio Online REST API you need to do some preparations:

  • Prerequisites:

Authentication for the REST APIs:

These APIs support OAuth for authorization and you should plan to use that. With Oauth your users don’t have to provide their Visual Studio Online credentials to use when the APIs are called. To get started on your app, though, you can authenticate using basic authentication. You’ll have to enable alternate credentials to work with basic auth.

1. Open your profile

profile[1]

2. Enable alternate credentials on the credentials tab

enableCredentials[1]

3. Set your credentials

One appropriate place to do that are the application settings. It is possible of course to have a custom approach, but the samples from this blog assumes that you set there your credentials.

VSO-WorkItems-Pic01

 

VSO-WorkItems-Pic02

 Managing work items in Visual Studio Online

We will cover the main functionalities in the context of , regarding to the Visual Studio Online REST API

  • Get a team project description

One of the main features is to get the information for the VSO Team project, The code below shows how to do that,

   1: VsoClient _vsoClient;

   2: IVsoProject _client;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _client = _vsoClient.GetService<IVsoProject>();

   6:  

   7: var projects = _client.GetTeamProjects().Result;

   8: var project = _client.GetTeamProject(projects[0].Id.ToString(), true).Result;

   9: Console.Write("Project=" + project.ToString());

  10: Console.Write("\n");

  11: var descr = project.Description;

  12: Console.Write("Project Descr=" + descr);

 

The sample app is a console application. You can see the result screen below.

VSO-WorkItems-Pic03 

  • Getting the types of all work items

Another useful feature is how to get all   the types of the work items. It is possible for each item using the GetWorkItemType() method.

   1: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   2: _clientWit = _vsoClient.GetService<IVsoWit>();

   3:  

   4: var workItemTypes = _clientWit.GetWorkItemTypes(Properties.Settings.Default.ProjectName).Result;

   5: Console.Write("workItemTypes=" + workItemTypes.ToString());

   6: Console.Write("\n");

   7: for(int i = 0; i < workItemTypes.Count; i++)

   8: {

   9:     var workItemTypeEl = _clientWit.GetWorkItemType(Properties.Settings.Default.ProjectName, workItemTypes.Items[i].Name).Result;

  10:     Console.Write("workItemType["+i+"]=" + workItemTypeEl.ToString());

  11:     Console.Write("\n");

  12: }

  13: var workItemType = _clientWit.GetWorkItemType(Properties.Settings.Default.ProjectName, workItemTypes.Items[0].Name).Result;

  14:  Console.Write("workItemType[0]=" + workItemType.ToString());

  15: Console.Write("\n");

 

Below you can se the result in the console application:

VSO-WorkItems-Pic04

  • Get a field from a specified work item:
   1: VsoClient _vsoClient;

   2: IVsoWit _clientWit;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _clientWit = _vsoClient.GetService<IVsoWit>();

   6:  

   7: var fields = _clientWit.GetFields().Result;

   8: Console.Write("fields=" + fields.ToString());

   9: var field = _clientWit.GetField(fields.Items[0].ReferenceName).Result;

  10: Console.Write("field[0]=" + fields.ToString());

 

  • Get a specified backlog item:

It is possible to get a specified work item by work item id using GetWorkItem(workItemId) method

   1: VsoClient _vsoClient;

   2: IVsoWit _clientWit;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _clientWit = _vsoClient.GetService<IVsoWit>();

   6:  

   7: var workItem = _clientWit.GetWorkItem(170);

   8: Console.Write("workItem=" + workItem.ToString());

   9: Console.Write("\n");

  10: var witType = workItem.Result.Fields["System.WorkItemType"];

  11: Console.Write("WIT Type =" + witType.ToString());

  12: Console.Write("\n");

  13: var witAreaPath = workItem.Result.Fields["System.AreaPath"];

  14: Console.Write("WIT Area Path =" + witAreaPath.ToString());

  15: Console.Write("\n");

  16:  var witState = workItem.Result.Fields["System.State"];

  17:  Console.Write("WIT State =" + witState.ToString());

  18: Console.Write("\n");

  19:  var witTitle = workItem.Result.Fields["System.Title"];

  20:  Console.Write("WIT Title =" + witTitle.ToString());

  21: Console.Write("\n");

 

VSO-WorkItems-Pic05 

  • Create and execute queries in VSO / TFS Online using VSO REST API

Queries help you find work items that you want to review, triage, update, or generate a report.

Use the search box to find work items. Enter the ID or use filters. If you want a flat list of work items, a hierarchical list using a tree query, or a list showing dependencies using a direct links query, use the query editor to choose the query type.

You can create queries in Visual Studio Online, Team Web Access (TWA), and Team Explorer. Also, you can open a query in Excel or Project to perform bulk modifications.

   1: VsoClient _vsoClient;

   2: IVsoWit _clientWit;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _clientWit = _vsoClient.GetService<IVsoWit>()

   6:  

   7: const string LINK_QUERY = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Product Backlog Item' AND [State] <> 'Closed' AND [State] <> 'Removed')";

   8: var ResultItems = _clientWit.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY).Result;

   9: for(int i =0; i < ResultItems.WorkItems.Count; i++)

  10: { 

  11:     var _id = ResultItems.WorkItems[i].Id;

  12:     Console.Write("\n");

  13:     Console.Write("WIT id =" + _id.ToString());

  14:     var _workItem = _clientWit.GetWorkItem(_id);

  15:     Console.Write("\n");

  16:     var _witAreaPath = _workItem.Result.Fields["System.AreaPath"];

  17:     Console.Write("WIT[" + _id  + "] Area Path =" + _witAreaPath.ToString());

  18:     Console.Write("\n");

  19:     var _witState = _workItem.Result.Fields["System.State"];

  20:     Console.Write("WIT[" + _id + "] State =" + _witState.ToString());

  21:     Console.Write("\n");

  22:     var _witTitle = _workItem.Result.Fields["System.Title"];

  23:     Console.Write("WIT[" + _id + "] Title =" + _witTitle.ToString());

  24:     Console.Write("\n");

  25: }

 

You can see the result in the test application console below:

VSO-WorkItems-Pic06

  • Create and update a work item

It is possible to use methods CreateWorkItem() and UpdateWorkItem() to create and update work items. The sample demo app demonstrates how to do that using the Visual Studio Online REST API. The initial state of the sample work items is shown below:

VSO-WorkItems-Pic07

Sample code also demonstrates how to create relations between work items:

   1: VsoClient _vsoClient;

   2: IVsoWit _clientWit;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _client = _vsoClient.GetService<IVsoWit>()

   6:  var orkItemId = 170;

   7: var workItems = _client.GetWorkItems(new int[] { workItemId }, RevisionExpandOptions.all).Result;

   8:  

   9: // Create new work item

  10: var bug = new WorkItem();

  11: bug.Fields["System.Title"] = "Sample bug N3";

  12: bug.Fields["System.History"] = DateTime.Now.ToString();

  13: bug = _client.CreateWorkItem(Properties.Settings.Default.ProjectName, "Bug", bug).Result;

  14:  

  15: var other = workItems[0];

  16:  

  17: // Update fields, add a link

  18: bug.Fields["System.Title"] = bug.Fields["System.Title"] + " (updated)";

  19: bug.Fields["System.Tags"] = "Demo Tag";

  20: Console.Write("\n");

  21: Console.Write("WIT id =" + workItemId.ToString());

  22: Console.Write("WIT[" + workItemId + "] Title =" + bug.Fields["System.Title"].ToString());

  23:  

  24: bug.Relations.Add(new WorkItemRelation()

  25: {

  26:     Url = other.Url,

  27:     Rel = "System.LinkTypes.Related",

  28:     Attributes = new RelationAttributes() { Comment = "Test Bug Relation" }

  29: });

  30:  

  31: bug = _client.UpdateWorkItem(bug).Result;

 

VSO-WorkItems-Pic08

The final result is shown below: a new bug: Sample Bug N3, updated and including a to another bug item.

VSO-WorkItems-Pic09

VSO-WorkItems-Pic09a 

  • Remove a work item ( bug)

It is also often seen case when you want to remove a work item. Actually it is not possible to remove it, but you can change the item state to “Removed”.

VSO-WorkItems-Pic10

   1: VsoClient _vsoClient;

   2: IVsoWit _client;

   3:  

   4: _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

   5: _client = _vsoClient.GetService<IVsoWit>()

   6:  

   7: const string LINK_QUERY = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Bug')";

   8: var ResultItems3 = _client.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY).Result;

   9:  

  10: var workItemTitle = "Sample bug N2"

  11:  

  12: for (int i = 0; i < ResultItems3.WorkItems.Count; i++)

  13: {

  14:     var _id = ResultItems3.WorkItems[i].Id;

  15:     

  16:     Console.Write("\n");

  17:     Console.Write("WIT id =" + _id.ToString());

  18:     var _workItem = _client.GetWorkItem(_id).Result;

  19:     if (_workItem.Fields["System.Title"].ToString().Contains(workItemTitle))

  20:     {

  21:         Console.Write("\n");

  22:         var _witTitle = _workItem.Fields["System.Title"];

  23:         Console.Write("WIT[" + _id + "] Title =" + _witTitle.ToString());

  24:         Console.Write("\n");

  25:         var _witState = _workItem.Fields["System.State"];

  26:         

  27:         Console.Write("WIT[" + _id + "] State =" + _witState.ToString());

  28:         Console.Write("\n");

  29:         _workItem.Fields["System.State"] = "Removed";

  30:         var bug = _client.UpdateWorkItem(_workItem).Result;

  31:         Console.Write("\n");

  32:         _witState = _workItem.Fields["System.State"];

  33:         Console.Write("WIT[" + _id + "] Updated State =" + _witState.ToString());

  34:         Console.Write("\n");

  35:     }

  36:  

  37:  

  38: }

 

VSO-WorkItems-Pic11

The screen below shows the state after the execution of the last snippet: The item with the state, equal to “Removed” is not displayed in the list with work items:

VSO-WorkItems-Pic12

Below you can see the code of the whole application:

   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using System.Text;

   5: using System.Threading.Tasks;

   6: using System.Net;

   7: using VisualStudioOnline.Api.Rest.V1.Client;

   8: using VisualStudioOnline.Api.Rest.V1.Model;

   9:  

  10: namespace DemoApp

  11: {

  12:     class Program

  13:     {

  14:         static void Main(string[] args)

  15:         {

  16:             VsoClient _vsoClient;

  17:             IVsoProject _client;

  18:             IVsoWit _clientWit;

  19:  

  20:             _vsoClient = new VsoClient(Properties.Settings.Default.AccountName, new NetworkCredential(Properties.Settings.Default.UserName, Properties.Settings.Default.Password));

  21:             _client = _vsoClient.GetService<IVsoProject>();

  22:             _clientWit = _vsoClient.GetService<IVsoWit>();

  23:  

  24:  

  25:  

  26:             if (args != null)

  27:             {

  28:                 Console.WriteLine("args is null"); // Check for null array

  29:  

  30:                 var option = args[0];

  31:  

  32:                 switch (option)

  33:                 {

  34:                     case "firstproject":

  35:                         var projects = _client.GetTeamProjects().Result;

  36:                         var project = _client.GetTeamProject(projects[0].Id.ToString(), true).Result;

  37:                         Console.Write("Project=" + project.ToString());

  38:                         Console.Write("\n");

  39:                         var descr = project.Description;

  40:                         Console.Write("Project Descr=" + descr);

  41:                         break;

  42:  

  43:                     case "workitemtypes":

  44:                         var workItemTypes = _clientWit.GetWorkItemTypes(Properties.Settings.Default.ProjectName).Result;

  45:                         Console.Write("workItemTypes=" + workItemTypes.ToString());

  46:                         Console.Write("\n");

  47:                         for(int i = 0; i < workItemTypes.Count; i++)

  48:                         {

  49:                             var workItemTypeEl = _clientWit.GetWorkItemType(Properties.Settings.Default.ProjectName, workItemTypes.Items[i].Name).Result;

  50:                             Console.Write("workItemType["+i+"]=" + workItemTypeEl.ToString());

  51:                             Console.Write("\n");

  52:                         }

  53:                         var workItemType = _clientWit.GetWorkItemType(Properties.Settings.Default.ProjectName, workItemTypes.Items[0].Name).Result;

  54:                          Console.Write("workItemType[0]=" + workItemType.ToString());

  55:                         Console.Write("\n");

  56:  

  57:                         break;

  58:  

  59:                     case "getfields":

  60:                         var fields = _clientWit.GetFields().Result;

  61:                         Console.Write("fields=" + fields.ToString());

  62:                         var field = _clientWit.GetField(fields.Items[0].ReferenceName).Result;

  63:                         Console.Write("field[0]=" + fields.ToString());

  64:  

  65:                         break;

  66:                     case "getbacklogitem":

  67:                         var workItem = _clientWit.GetWorkItem(170);

  68:                         Console.Write("workItem=" + workItem.ToString());

  69:                         Console.Write("\n");

  70:                         var witType = workItem.Result.Fields["System.WorkItemType"];

  71:                         Console.Write("WIT Type =" + witType.ToString());

  72:                         Console.Write("\n");

  73:                         var witAreaPath = workItem.Result.Fields["System.AreaPath"];

  74:                         Console.Write("WIT Area Path =" + witAreaPath.ToString());

  75:                         Console.Write("\n");

  76:                          var witState = workItem.Result.Fields["System.State"];

  77:                          Console.Write("WIT State =" + witState.ToString());

  78:                         Console.Write("\n");

  79:                          var witTitle = workItem.Result.Fields["System.Title"];

  80:                          Console.Write("WIT Title =" + witTitle.ToString());

  81:                         Console.Write("\n");

  82:  

  83:                         break;

  84:  

  85:                     case "TestRunQuery":

  86:  

  87:                         const string LINK_QUERY2 = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Product Backlog Item' AND [State] <> 'Closed' AND [State] <> 'Removed')";

  88:                         var ResultItems2 = _clientWit.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY2).Result;

  89:                         var _id2 = ResultItems2.WorkItems[0].Id;

  90:                         var _workItem2 = _clientWit.GetWorkItem(_id2);

  91:                         Console.Write("\n");

  92:                         var _witAreaPath2 = _workItem2.Result.Fields["System.AreaPath"];

  93:                         Console.Write("WIT Area Path =" + _witAreaPath2.ToString());

  94:                         Console.Write("\n");

  95:                         var _witState2 = _workItem2.Result.Fields["System.State"];

  96:                         Console.Write("WIT State =" + _witState2.ToString());

  97:                         Console.Write("\n");

  98:                         var _witTitle2 = _workItem2.Result.Fields["System.Title"];

  99:                         Console.Write("WIT Title =" + _witTitle2.ToString());

 100:                         Console.Write("\n");

 101:                         Console.Write("Flat Query Result =" + ResultItems2.ToString());

 102:                         Console.Write("\n");                        

 103:  

 104:                         break;

 105:                     case "TestRunQueries":

 106:  

 107:                         const string LINK_QUERY = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Product Backlog Item' AND [State] <> 'Closed' AND [State] <> 'Removed')";

 108:                         var ResultItems = _clientWit.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY).Result;

 109:                         for(int i =0; i < ResultItems.WorkItems.Count; i++)

 110:                         { 

 111:                             var _id = ResultItems.WorkItems[i].Id;

 112:                             Console.Write("\n");

 113:                             Console.Write("WIT id =" + _id.ToString());

 114:                             var _workItem = _clientWit.GetWorkItem(_id);

 115:                             Console.Write("\n");

 116:                             var _witAreaPath = _workItem.Result.Fields["System.AreaPath"];

 117:                             Console.Write("WIT[" + _id  + "] Area Path =" + _witAreaPath.ToString());

 118:                             Console.Write("\n");

 119:                             var _witState = _workItem.Result.Fields["System.State"];

 120:                             Console.Write("WIT[" + _id + "] State =" + _witState.ToString());

 121:                             Console.Write("\n");

 122:                             var _witTitle = _workItem.Result.Fields["System.Title"];

 123:                             Console.Write("WIT[" + _id + "] Title =" + _witTitle.ToString());

 124:                             Console.Write("\n");

 125:                         }

 126:  

 127:                         break;

 128:  

 129:                     case "CreateAndUpdateWorkItem":

 130:  

 131:  

 132:  

 133:                         CreateAndUpdateWorkItem(_clientWit, 170);

 134:                         break;

 135:  

 136:                     case "RemoveBugItem":

 137:  

 138:                         RemoveBugItem(_clientWit, "Sample Bug N2");

 139:  

 140:                         break;

 141:  

 142:                 }

 143:             }

 144:             

 145:  

 146:             Console.ReadLine();

 147:  

 148:         }

 149:  

 150:         public static void CreateAndUpdateWorkItem(IVsoWit _client, int workItemId)

 151:         {

 152:             var workItems = _client.GetWorkItems(new int[] { workItemId }, RevisionExpandOptions.all).Result;

 153:  

 154:             // Create new work item

 155:             var bug = new WorkItem();

 156:             bug.Fields["System.Title"] = "Sample bug N3";

 157:             bug.Fields["System.History"] = DateTime.Now.ToString();

 158:             bug = _client.CreateWorkItem(Properties.Settings.Default.ProjectName, "Bug", bug).Result;

 159:  

 160:             var other = workItems[0];

 161:  

 162:             // Update fields, add a link

 163:             bug.Fields["System.Title"] = bug.Fields["System.Title"] + " (updated)";

 164:             bug.Fields["System.Tags"] = "Demo Tag";

 165:             Console.Write("\n");

 166:             Console.Write("WIT id =" + workItemId.ToString());

 167:             Console.Write("WIT[" + workItemId + "] Title =" + bug.Fields["System.Title"].ToString());

 168:  

 169:             bug.Relations.Add(new WorkItemRelation()

 170:             {

 171:                 Url = other.Url,

 172:                 Rel = "System.LinkTypes.Related",

 173:                 Attributes = new RelationAttributes() { Comment = "Test Bug Relation" }

 174:             });

 175:  

 176:             bug = _client.UpdateWorkItem(bug).Result;

 177:         }

 178:  

 179:  

 180:         public static void RemoveBugItem(IVsoWit _client, int workItemId)

 181:         {

 182:             //"Sample bug N2 (updated)"

 183:             const string LINK_QUERY = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Bug' AND [State] <> 'Closed' AND [State] <> 'Removed')";

 184:             var ResultItems = _client.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY).Result;

 185:             var workItems = _client.GetWorkItems(new int[] { workItemId }, RevisionExpandOptions.all).Result;

 186:             // Create new work item

 187:             var bug = new WorkItem();

 188:             bug.Fields["System.Title"] = "Sample bug N3";

 189:             bug.Fields["System.History"] = DateTime.Now.ToString();

 190:             bug = _client.CreateWorkItem(Properties.Settings.Default.ProjectName, "Bug", bug).Result;

 191:  

 192:             var other = workItems[0];

 193:  

 194:             // Update fields, add a link

 195:             bug.Fields["System.Title"] = bug.Fields["System.Title"] + " (updated)";

 196:             bug.Fields["System.Tags"] = "Demo Tag";

 197:             Console.Write("\n");

 198:             Console.Write("WIT id =" + workItemId.ToString());

 199:             Console.Write("WIT[" + workItemId + "] Title =" + bug.Fields["System.Title"].ToString());

 200:  

 201:             bug.Relations.Add(new WorkItemRelation()

 202:             {

 203:                 Url = other.Url,

 204:                 //Rel = "System.LinkTypes.Dependency-Forward",

 205:                 Rel = "System.LinkTypes.Related",

 206:                 Attributes = new RelationAttributes() { Comment = "Test Буг Relation" }

 207:             });

 208:  

 209:             bug = _client.UpdateWorkItem(bug).Result;

 210:         }

 211:  

 212:         public static void RemoveBugItem(IVsoWit _client, string workItemTitle)

 213:         {

 214:             //"Sample bug N2 (updated)"

 215:             const string LINK_QUERY = "Select System.Id, System.Title, System.State From WorkItems Where ([System.WorkItemType] = 'Bug')";

 216:             var ResultItems3 = _client.RunFlatQuery(Properties.Settings.Default.ProjectName, LINK_QUERY).Result;

 217:  

 218:             for (int i = 0; i < ResultItems3.WorkItems.Count; i++)

 219:             {

 220:                 var _id = ResultItems3.WorkItems[i].Id;

 221:                 

 222:                 Console.Write("\n");

 223:                 Console.Write("WIT id =" + _id.ToString());

 224:                 var _workItem = _client.GetWorkItem(_id).Result;

 225:                 if (_workItem.Fields["System.Title"].ToString().Contains(workItemTitle))

 226:                 {

 227:                     Console.Write("\n");

 228:                     var _witTitle = _workItem.Fields["System.Title"];

 229:                     Console.Write("WIT[" + _id + "] Title =" + _witTitle.ToString());

 230:                     Console.Write("\n");

 231:                     var _witState = _workItem.Fields["System.State"];

 232:                     

 233:                     Console.Write("WIT[" + _id + "] State =" + _witState.ToString());

 234:                     Console.Write("\n");

 235:                     _workItem.Fields["System.State"] = "Removed";

 236:                     var bug = _client.UpdateWorkItem(_workItem).Result;

 237:                     Console.Write("\n");

 238:                     _witState = _workItem.Fields["System.State"];

 239:                     Console.Write("WIT[" + _id + "] Updated State =" + _witState.ToString());

 240:                     Console.Write("\n");

 241:                 }

 242:  

 243:  

 244:             }

 245:         }

 246:     }

 247: }

 

If you want more information about haw to manage programmatically  Visual Studio Online work otems feel free to contact me at michael@mateev.net Follow my blog : mmateev.infragistics.com  .

You can learn more about the PASS events if you follow me on Twitter @mihailmateev  , and stay in touch on Facebook, Google+, LinkedIn and Bulgarian BI and .Net User Group !

mvp

Advertisements
Posted in .Net, Azure, C#, Cloud, Kanban, Microsoft Azure, Scrum, TFS, TFS Online, Visual Studio 2013, Visual Studio Online, VSO | Leave a comment

CEE MVP Open Days 2015

The event was held on Sunday and Monday: 29 – 30 of March of March 2015 in Belgrade . Serbia. Each year the Microsoft MVPs from each region meet at special “MVP Open Days” event, meeting also professionals from Microsoft Product teams. This was f the biggest Microsoft MVP Open Days for the Central Eastern Europe Region. MVPs met also specialist from the Microsoft Development Lab in Serbia.

Many special thanks to Alessandro Teglia ( EMEA Regional Manager for the MVP Award Program @Microsoft )  , Yulia Belyanina ( Community Program Manager, CEE @Microsoft) and Marina Terzi ( MVP coordinator @ Microsoft ) who did a lot this event to be organized.

This was my first event as a speakers after I joined Strypes / ICT Automatisering . I’m glad that my sessions about modern IoT solutions with Microsoft Azure was included in the schedule. That gave me opportunity to share some impressions about solutions architecture and best practices regarding to the experience gain in Strypes and ICT Automasering .

You can enjoy some photos from the event below:

11096571_10206343973868919_8300165194104039360_n[1]

11081368_10206345080576586_39145765400419315_n[1]

11103021_781087831959602_7602724336484114163_n[1]

11082555_10206344808929795_4758352264124318729_n[1]

11081073_781087955292923_2363353690240429989_n[1]

10665200_10204931179692789_3024002307507526831_n[1]

Event Recap:

– It was the MVP Open Days event with most ever MVPs – participants from CEE

– There was 3 sessions from MVPs from Bulgaria

– My session on “Think Connected – Modern IoT Solutions with Microsoft Azure” was included in the track with technical presentations

You can learn more about the community events in CEE if you follow me on Twitter @mihailmateev , and stay in touch on Facebook, Google+, LinkedIn and Bulgarian BI and .Net User Group !

pass_logo_partner_bw[1] Strypes-LOGO+payoff_FC

Posted in .Net, Azure, Azure NoSQL, Azure Storage, ceeod, COD15, ICT, ict.eu, Internet of Things, IoT, Microsoft, Microsoft Azure, Microsoft cloud, MVP, MVPBuzz, Strypes, Strypes.eu | Leave a comment

Get each eBook and Video prom Packt Publishing only for 5$

 

If you like eBooks and videos, provided from Pack Publishing you have chance to buy each of them only for 5$. You can do this until 6th of January. Consider this attractive offer – especially if you want to read and watch about the latest technologies for app development and future trentds

clip_image002

Following the success of last year’s festive offer, Packt Publishing will be celebrating the holiday season with an even bigger $5 offer.  

From Thursday 18th December, every eBook and video will be available on the publisher’s website for just $5. Customers are invited to purchase as many as they like before the offer ends on Tuesday January 6th, making it the perfect opportunity to try something new or to take your skills to the next level as 2015 begins.

With all $5 products available in a range of formats and DRM-free, customers will find great value content delivered exactly how they want it across Packt’s website this Xmas and New Year.

Find out more at – http://bit.ly/1wlsbea

Posted in Android, eBonanza, eBooks, iOS, JavaScript, jQuery, JS, mobile, Packt, Packt Publishing, Packtpub, SQL, SQL Server | Leave a comment

SQLSaturday #356 Slovenia 2014–Event Recap

 

sqlsat356_web2The event was held on Saturday, 13th of December 2014 in Faculty of Computer and Information Science, Ljubljana, Slovenia.   It was one of the most attractive conferences about Microsoft data platform in the region

I was very glad to speak at this event as an independent speaker. My session was about

Entity Framework 6.1 new Features and EF 7 Sneak Peak. Slides are available on the SQLSaturday #356 Slovenia website .

This was the second SQLSaturday in Slovenia.

Administrators of the conference: Dejan Sarka , Mlaqden Prajdic and  Matja Lan demonstrated an awesome organization, that is one of the best examples how one event could be organized. They build a very strong team, that arranged everything in the best way. The registrations drop off was less than 5%.

The #sqlsat356 conference venue: Faculty of Computer and Information Science in Ljubljana

Denny Cherry – @MrDenny is talking about indexes in SQL Server

#sqlsat356 lunch break

Milos Radivojevic in action:

SQLSaturday Slovenia raffle and closing

Event statistics:

  • more than 220 attendees on place
  • 4 tracks
  • 24 technical sessions
  • Speakers and attendees from 16 countries

If you want more information about the event and PASS community feel free to contact me at michael@mateev.net Follow this event on Twitter with hash tag  #SQLSatSlovenia.

You can learn more about the PASS events if you follow me on Twitter @mihailmateev  , and stay in touch on Facebook, Google+, LinkedIn and Bulgarian BI and .Net User Group !

 

Posted in BI, BI & .Net Geeks, BI & .Net UG, BI & .NET User Group, EF, EF 6, EF 7, Entity Famework 6.1, Entity Framework 6, Entity Framework 7, Entity Framewrok, ORM, PASS, SQL, SQL Saturday, SQL Server, SQL Server 2012, sqlfamily, sqlpass, sqlsat356, sqlsatslovenia, SQLSaturday, SQLServer, SQLServer 2014 | Leave a comment

SQLSaturday #359 Ustanbul 2014 – Event Recap

 

SQLSAT359_SPEAKINGThe event was held on Saturday, 6th of December 2014 in Microsoft – Bellevue Residences.   It was one of the biggest Microsoft data platform related events in the region

I was very glad to speak at this event as an independent speaker. My session was about

Scaling Out Microsoft Azure SQL Databases Slides are also available for download.

There was an additional event: PreConf , one-day training about SQL Server Query Tuning & Optimization hold by Benjamin Nevarez  on Friday 5-th of December.

This was the fourth SQLSaturday in Istanbul. Administrators of the conference were Yigit Aktan and Turgay Sahtiyan

They organized a team of volunteers who did an awesome event.

0045398f-ccf3-486c-8bda-fbc9751429a5 sqlsat359-1

sqlsat359-3 sqlsat359-4

Event in numbers:

  • more than 250 attendees on place
  • 5 tracks
  • 25 technical sessions

If you want more information about the event and PASS community feel free to contact me at michael@mateev.net Follow this event on Twitter with hash tag  #sqlsatIstanbul.

You can learn more about the PASS events if you follow me on Twitter @mihailmateev  , and stay in touch on Facebook, Google+, LinkedIn and Bulgarian BI and .Net User Group !

Posted in Azure DB Elastic Scale, Azure SQL Datbase Scale Out, Microsoft, Microsoft Azure, Microsoft cloud, Mihail Mateev, PASS, Scale-Out, SQL, SQL Saturday, SQL Server, SQL Server 2012, sqlfamily, sqlpass, sqlsat359, sqlsatistanbul, SQLServer, SQLServer 2014 | Leave a comment

JSNext Bulgaria 2014–Event Recap

On November 23 was held the first event focused on the cutting edge JavaScript technologies – JSNext Bulgaria 2014. JSnext  is the largest conference in Bulgaria for JavaScript technologies.

What is JSNext Bulgaria

  • The very first conference in Bulgaria dedicated to the cutting edge JavaScript and related JS frameworks
  • An event organized with the support of Infragistics, jQuery Sofia UG, Infragistics Friends ( BI & .Net) UG and many volunteers
  • Thanks to the sponsors who helped cover the expenses!
  • An one day event with sessions dedicated to all that is JavaScript.
  • It is a chance for the local community to immerse in their favorite web technologies
  • The largest event for WEB developers in Bulgaria for 2014
  • JSNext Bulgaria inherits jQuery Bulgaria event

 

Why  JSNext Bulgaria

  • JavaScript is not jQuery any more
  • JSNext (aka JS version next ) Bulgaria is an event about cutting edge JS-related technologies

 

Event history:

After the few successful “Saturday” format events across different platforms and jQuery Bulgaria conference, the JavaScript event received major interest.

JSNext inherits jQuery Bulgaria conference, but JSNext Bulgaira is a new kind of event :
mainly targeting the latest and the future JavaScript technologies

Infragistics confirmed its support for the event: Thanks to Jason Beres: VP of Development Tools,  Product Management, Community and Evangelism @ Infragistics
Thanks to all community leaders who also confirmed their support!

We chose Sofia Event Center as the best location for this event.

All our speakers are also volunteers – they decided to cover their own expenses to be possible to avoid charging community members

 

 

 

 

 

 

 

 

 

 

Infragistics participation in the event:

Infragistics was the main sponsor and organizer of the event.

There was one keynote session and one technical presentation from Infragistics Inc.:

 

Some statistic

  • Nearly 750 registrations
  • More than 600 attendees on site
  • First event in Bulgaria, dedicated to the cutting edge JavaScript related technologies. 
  • The biggest event for WEB developers in Bulgaria this year
  • A Free event for student, academics and community leads
  • 22 sessions in 4 tracks
  • Attendees from 6 countries (Ukraine, Poland, Macedonia, Serbia , Romania and Bulgaria)
  • 25 Speakers from 4 countries (Ukraine, Poland, Macedonia and Bulgaria )

Pictures from the event:

Some photos are available here .

Follow @jsnextconf event on Twitter with hash tag   and get news on all our events with #jsnext and #jsnextconf.  Additional information can be found at the conference website – www.jsnext.net

As always, you can follow us on Twitter @mihailmateev and @Infragistics and stay in touch onFacebook,Google+andLinkedIn!

 

Warm Regards,
Team JSNext Bulgaria

Posted in .Net, Angular, Angular.js, AngularJS, ASP, ASP.Net MVC, Azure Web Sites, IG, Ignite UI, IgniteUI, Infragistics, Infragistics Bulgaria, Infragistics Friends, Infragistics Inc., jQuery, jQuery Sofia, JS, JSNext, JSNext 2014, JSNext Bulgaria, Knockout, Knockout.js, KnockoutJS, Node, Node.js, Node.js and Azure, NodeJS, Polymer, React.js, Three.js, TypeScript, UX | Leave a comment

SQLSaturday #311 Bulgaria 2014–Event Recap and Follow-up

After the successful SQLSaturday # 152 and SQLSaturday # 199 for the third time in Bulgaria SQLSaturday was held for the third on 11 of October, 2014. It was the biggest SQLSaturday organized in Bulgaria and the region around. This event is organized from PASS with the major support of Infragistics, Infragistics Friends User Group ( BI & .Net Geeks) and many partners, sponsors and volunteers.

 

What is SQL Saturday:

Infragistics as a company that develops solutions for data visualization and business solutions has many common points in with areas covered from the  conference: BI, Reporting, SQL Server related solutions

 

Our statistics:

  • 400 registrations + 91 people in the wait list.
  • around 250 real attendees from 16 countries (USA, UK, Portugal, Poland, Holland, Belgium, Turkey, Ukraine, Russia, Bulgaria and Serbia).
  • Speakers and attendees from 16 countries
  • 27 speakers from 15 different countries( Austria, Germany, UK, Denmark, Nederland, Portugal,  Poland, Hungary, Romania, Slovenia, Macedonia, Russia, Ukraine, Turkey and Bulgaria )
  • 16 Microsoft MVPs
  • 3 Microsoft MCMs
  • 30 sessions in 5 tracks
  • Attendees from 5 countries ( Serbia, Macedonia, Romania, Ukraine and Bulgaria )
  • The biggest event on Microsoft Data Platform ever organized in the region

 

Some pictures from this event:

Dejan Sarka is talking about Optimizing Temporal Queries

 

Magi Naumova is presenting

 

Lunch break:

 

Milos Radivojevic (  @MilosSQL ) in action:

 

Some of the speakers:

 

The SQLSaturday #311 Bulgaria raffle

 

Some of the raffle winners:

 

You can see more pictures from the conference here:

Feedback in Twitter about SQLSaturday #311 Bulgaria

 

 

Infragistics participation in the event:

  • Infragistics was SQLSaturday Bulgaria  conference host , main supporter and a  gold sponsor.
  • Administrators at the conference were Jason Beres and Mihail Mateev
  • There was more than 15 volunteers from Infragistics Bulgaria who helped  the conference to be held
  • There was 1 technical presentation from Infragistics:
    Node.js for SQLServer Nerds : Mihail Mateev

The conference schedule is available here:

Now SQLSaturday Bulgaria Team is looking for appropriate dates for SQLSaturday Bulgaria 2015.

More information about SQLSaturday Bulgaria is available  on the website of the conference http://www.sqlsaturday.com/311/  ,  SQL Saturday Bulgaria Facebook page and you can follow #sqlsatBulgaria and #sqlsat311  on Twitter.

Follow news from Infragistics for more information about new Infragistics events.

As always, you can follow us on Twitter @mihailmateev and @Infragistics and stay in touch on Facebook, Google+andLinkedIn!

Warm Regards,
SQLSaturday Bulgaria Team

 sqlsat311 Saturday

Posted in Azure Blob Storage, Azure NoSQL, Azure Storage, Azure Table Storage, Infragistics, Infragistics Bulgaria, Infragistics Friends, Infragistics Inc., PASS, SQL, SQL Saturday, SQL Server, SQL Spatial, sqlfamily, sqlpass, sqlsat311, sqlsatbulgaria, sqlsatsofia, SQLSaturday, SQLSaturday #311, SQLSaturday #311 Bulgaria, SQLSaturday Bulgaria, SQLServer 2014 | Leave a comment