Click here to Skip to main content
15,886,773 members
Articles / Web Development / ASP.NET

Socialize your ASP.NET application with OpenSocial

Rate me:
Please Sign up or sign in to vote.
5.00/5 (13 votes)
26 Sep 2012Apache7 min read 32.2K   969   43  
This article briefly describes what is OpenSocial and how to use it in ASP.NET applications by Catpic
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using System.Web;
using Catpic.Social.Activities;
using Catpic.Utils;

namespace Catpic.Host.Engine.Social
{
    using Catpic.Social;

    /// <summary>
    /// Provides default implementation of activities/activity streams repositories
    /// </summary>
    public class ActivityStreamsRepository: IRepository<ActivityEntry>
    {
        private readonly IList<EntityCollection<ActivityEntry>> _activities;
        private IQueryable<EntityCollection<ActivityEntry>> _queryable;

        public ActivityStreamsRepository(IList<EntityCollection<ActivityEntry>> activities)
         {
             _activities = activities;
             _queryable = activities.AsQueryable();
         }

        public IQueryable GetQueryable()
        {
            return _queryable;
        }

        public Task<IQueryable> SelectAsync(Expression expression)
        {
            return AsyncHelper.GetEmptyTask<IQueryable>(_queryable.Provider.CreateQuery(expression));
        }

        public Task<string> DeleteCollectionAsync(string userId, string id)
        {
            throw new NotImplementedException();
        }

        public Task<IEnumerable<object>> Select(Expression expression)
        {
            var query = _queryable.Provider.CreateQuery(expression);
            return AsyncHelper.GetEmptyTask(query as IEnumerable<object>);
        }


        public Task<ActivityEntry> AddEntityAsync(string userId, string collectionId, ActivityEntry activity)
        {
            var collection = _activities.Single(c => c.UserId == userId && c.Type == collectionId);

            activity.Id = GetId(collection.Entities.Last());
            activity.UserId = userId;
            var list = collection.Entities.ToList();
            list.Add(activity);
            collection.Entities = list;
            
            _queryable = _activities.AsQueryable();
            return AsyncHelper.GetEmptyTask(activity);
        }

        public Task<ActivityEntry> UpdateEntityAsync(string userId, string collectionId, ActivityEntry entity)
        {
            var collection = _activities.Single(p => p.UserId == userId && p.Type == collectionId);
            var activity = collection.Entities.Single(a => a.Id == entity.Id);
            // NOTE: dummy implementation for unit testing
            activity.Title = entity.Title;
            return AsyncHelper.GetEmptyTask(activity);
        }

        public Task<ActivityEntry> DeleteEntityAsync(string userId, string collectionId, ActivityEntry entity)
        {
            var collection = _activities.Single(p => p.UserId == userId && p.Type == collectionId);
            var activity = collection.Entities.Single(a => a.Id == entity.Id);
            (collection.Entities as List<ActivityEntry>).Remove(activity);

            return AsyncHelper.GetEmptyTask(activity);
        }

        public Task<string> AddCollectionAsync(EntityCollection<ActivityEntry> collection)
        {
            throw new NotImplementedException();
        }

        public Task<string> UpdateCollectionAsync(EntityCollection<ActivityEntry> collection)
        {
            throw new NotImplementedException();
        }

        private string GetId(ActivityEntry last)
        {
            // USED ONLY FOR UNIT TESTING!
            var id = last.Id;
            int number;
            if(Int32.TryParse(id, out number)) 
                return number.ToString();
            if(id.StartsWith("activity"))
            {
                return (int.Parse(id.TrimStart("activity".ToCharArray()))+1).ToString();
            }

            throw new InvalidOperationException("Unable to generate valid unit testing id");
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Apache License, Version 2.0


Written By
Software Developer (Senior) Nokia
Germany Germany
Interested in design/development of framework functionality using the best patterns and practices.

Comments and Discussions