2020-02-12 07:58:31 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
using ASC.Api.Core;
|
|
|
|
|
using ASC.Common.Logging;
|
|
|
|
|
using ASC.Common.Utils;
|
|
|
|
|
using ASC.Core;
|
|
|
|
|
using ASC.Core.Common.Settings;
|
|
|
|
|
using ASC.Core.Tenants;
|
|
|
|
|
using ASC.Core.Users;
|
|
|
|
|
using ASC.Data.Reassigns;
|
|
|
|
|
using ASC.FederatedLogin;
|
|
|
|
|
using ASC.MessagingSystem;
|
|
|
|
|
using ASC.Calendar.Models;
|
|
|
|
|
using ASC.Security.Cryptography;
|
|
|
|
|
using ASC.Web.Api.Routing;
|
|
|
|
|
using ASC.Web.Core;
|
|
|
|
|
using ASC.Web.Core.Users;
|
|
|
|
|
using ASC.Web.Studio.Core;
|
|
|
|
|
using ASC.Web.Studio.Core.Notify;
|
|
|
|
|
using ASC.Web.Studio.UserControls.Statistics;
|
|
|
|
|
using ASC.Web.Studio.Utility;
|
|
|
|
|
|
|
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
|
|
|
|
using SecurityContext = ASC.Core.SecurityContext;
|
2020-02-19 10:26:11 +00:00
|
|
|
|
using ASC.Calendar.Core;
|
|
|
|
|
using ASC.Calendar.Core.Dao;
|
2020-02-21 12:33:51 +00:00
|
|
|
|
using ASC.Calendar.BusinessObjects;
|
2020-02-26 11:44:32 +00:00
|
|
|
|
using ASC.Web.Core.Calendars;
|
|
|
|
|
using ASC.Calendar.ExternalCalendars;
|
|
|
|
|
using System.Linq;
|
2020-02-27 08:50:06 +00:00
|
|
|
|
using System;
|
|
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
|
using HttpContext = Microsoft.AspNetCore.Http.HttpContext;
|
|
|
|
|
using System.Web;
|
|
|
|
|
using ASC.Calendar.Notification;
|
2020-02-27 14:15:25 +00:00
|
|
|
|
using ASC.Common;
|
2020-02-12 07:58:31 +00:00
|
|
|
|
|
|
|
|
|
namespace ASC.Calendar.Controllers
|
|
|
|
|
{
|
|
|
|
|
[DefaultRoute]
|
|
|
|
|
[ApiController]
|
|
|
|
|
public class CalendarController : ControllerBase
|
|
|
|
|
{
|
2020-02-21 12:33:51 +00:00
|
|
|
|
|
2020-02-12 07:58:31 +00:00
|
|
|
|
public Tenant Tenant { get { return ApiContext.Tenant; } }
|
|
|
|
|
public ApiContext ApiContext { get; }
|
2020-02-26 11:44:32 +00:00
|
|
|
|
public AuthContext AuthContext { get; }
|
2020-02-13 09:18:13 +00:00
|
|
|
|
public UserManager UserManager { get; }
|
2020-02-21 12:33:51 +00:00
|
|
|
|
public DataProvider DataProvider { get; }
|
2020-02-12 07:58:31 +00:00
|
|
|
|
public ILog Log { get; }
|
2020-02-26 11:44:32 +00:00
|
|
|
|
private TenantManager TenantManager { get; }
|
2020-02-21 12:33:51 +00:00
|
|
|
|
public TimeZoneConverter TimeZoneConverter { get; }
|
|
|
|
|
public CalendarWrapperHelper CalendarWrapperHelper { get; }
|
2020-02-26 11:44:32 +00:00
|
|
|
|
public DisplayUserSettingsHelper DisplayUserSettingsHelper { get; }
|
2020-02-27 08:50:06 +00:00
|
|
|
|
private AuthorizationManager AuthorizationManager { get; }
|
|
|
|
|
private AuthManager Authentication { get; }
|
|
|
|
|
public HttpContext HttpContext { get; set; }
|
|
|
|
|
|
2020-02-12 07:58:31 +00:00
|
|
|
|
public CalendarController(
|
|
|
|
|
|
|
|
|
|
ApiContext apiContext,
|
2020-02-26 11:44:32 +00:00
|
|
|
|
AuthContext authContext,
|
2020-02-27 08:50:06 +00:00
|
|
|
|
AuthorizationManager authorizationManager,
|
2020-02-13 09:18:13 +00:00
|
|
|
|
UserManager userManager,
|
2020-02-26 11:44:32 +00:00
|
|
|
|
TenantManager tenantManager,
|
2020-02-21 12:33:51 +00:00
|
|
|
|
TimeZoneConverter timeZoneConverter,
|
2020-02-26 11:44:32 +00:00
|
|
|
|
DisplayUserSettingsHelper displayUserSettingsHelper,
|
2020-02-19 10:26:11 +00:00
|
|
|
|
IOptionsMonitor<ILog> option,
|
|
|
|
|
|
2020-02-21 12:33:51 +00:00
|
|
|
|
DataProvider dataProvider,
|
2020-02-27 08:50:06 +00:00
|
|
|
|
IHttpContextAccessor httpContextAccessor,
|
|
|
|
|
CalendarWrapperHelper calendarWrapperHelper,
|
|
|
|
|
AuthManager authentication)
|
2020-02-12 07:58:31 +00:00
|
|
|
|
{
|
2020-02-26 11:44:32 +00:00
|
|
|
|
AuthContext = authContext;
|
2020-02-27 08:50:06 +00:00
|
|
|
|
Authentication = authentication;
|
|
|
|
|
AuthorizationManager = authorizationManager;
|
2020-02-26 11:44:32 +00:00
|
|
|
|
TenantManager = tenantManager;
|
2020-02-12 07:58:31 +00:00
|
|
|
|
Log = option.Get("ASC.Api");
|
2020-02-21 12:33:51 +00:00
|
|
|
|
TimeZoneConverter = timeZoneConverter;
|
2020-02-12 07:58:31 +00:00
|
|
|
|
ApiContext = apiContext;
|
2020-02-13 09:18:13 +00:00
|
|
|
|
UserManager = userManager;
|
2020-02-21 12:33:51 +00:00
|
|
|
|
DataProvider = dataProvider;
|
2020-02-25 13:36:20 +00:00
|
|
|
|
CalendarWrapperHelper = calendarWrapperHelper;
|
2020-02-26 11:44:32 +00:00
|
|
|
|
DisplayUserSettingsHelper = displayUserSettingsHelper;
|
|
|
|
|
|
|
|
|
|
CalendarManager.Instance.RegistryCalendar(new SharedEventsCalendar(AuthContext, TimeZoneConverter, TenantManager));
|
|
|
|
|
var birthdayReminderCalendar = new BirthdayReminderCalendar(AuthContext, TimeZoneConverter, UserManager, DisplayUserSettingsHelper);
|
|
|
|
|
if (UserManager.IsUserInGroup(AuthContext.CurrentAccount.ID, Constants.GroupVisitor.ID))
|
|
|
|
|
{
|
|
|
|
|
CalendarManager.Instance.UnRegistryCalendar(birthdayReminderCalendar.Id);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
CalendarManager.Instance.RegistryCalendar(birthdayReminderCalendar);
|
|
|
|
|
}
|
2020-02-27 08:50:06 +00:00
|
|
|
|
HttpContext = httpContextAccessor?.HttpContext;
|
|
|
|
|
}
|
|
|
|
|
public class SharingParam : SharingOptions.PublicItem
|
|
|
|
|
{
|
|
|
|
|
public string actionId { get; set; }
|
|
|
|
|
public Guid itemId
|
|
|
|
|
{
|
|
|
|
|
get { return Id; }
|
|
|
|
|
set { Id = value; }
|
|
|
|
|
}
|
|
|
|
|
public bool isGroup
|
|
|
|
|
{
|
|
|
|
|
get { return IsGroup; }
|
|
|
|
|
set { IsGroup = value; }
|
|
|
|
|
}
|
2020-02-12 07:58:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Read("info")]
|
|
|
|
|
public Module GetModule()
|
|
|
|
|
{
|
|
|
|
|
var product = new CalendarProduct();
|
|
|
|
|
product.Init();
|
|
|
|
|
return new Module(product, true);
|
|
|
|
|
}
|
|
|
|
|
|
2020-02-19 10:26:11 +00:00
|
|
|
|
[Read("{calendarId}")]
|
2020-02-26 11:44:32 +00:00
|
|
|
|
public CalendarWrapper GetCalendarById(string calendarId)
|
2020-02-19 10:26:11 +00:00
|
|
|
|
{
|
2020-02-26 11:44:32 +00:00
|
|
|
|
int calId;
|
|
|
|
|
if (int.TryParse(calendarId, out calId))
|
|
|
|
|
{
|
|
|
|
|
var calendars = DataProvider.GetCalendarById(calId);
|
|
|
|
|
|
|
|
|
|
return (calendars != null ? CalendarWrapperHelper.Get(calendars) : null);
|
|
|
|
|
}
|
2020-02-19 10:26:11 +00:00
|
|
|
|
|
2020-02-26 11:44:32 +00:00
|
|
|
|
var extCalendar = CalendarManager.Instance.GetCalendarForUser(AuthContext.CurrentAccount.ID, calendarId, UserManager);
|
|
|
|
|
if (extCalendar != null)
|
|
|
|
|
{
|
|
|
|
|
var viewSettings = DataProvider.GetUserViewSettings(AuthContext.CurrentAccount.ID, new List<string> { calendarId });
|
|
|
|
|
return CalendarWrapperHelper.Get(extCalendar, viewSettings.FirstOrDefault());
|
|
|
|
|
}
|
|
|
|
|
return null;
|
2020-02-19 10:26:11 +00:00
|
|
|
|
}
|
2020-02-27 08:50:06 +00:00
|
|
|
|
|
|
|
|
|
[Create]
|
|
|
|
|
public CalendarWrapper CreateCalendar(CalendarModel calendar)
|
|
|
|
|
{
|
|
|
|
|
//string name, string description, string textColor, string backgroundColor, string timeZone, EventAlertType alertType, List<SharingParam> sharingOptions, string iCalUrl, int isTodo = 0
|
|
|
|
|
|
|
|
|
|
var sharingOptionsList = calendar.sharingOptions ?? new List<SharingParam>();
|
|
|
|
|
var timeZoneInfo = TimeZoneConverter.GetTimeZone(calendar.TimeZone);
|
|
|
|
|
|
|
|
|
|
calendar.Name = (calendar.Name ?? "").Trim();
|
|
|
|
|
if (String.IsNullOrEmpty(calendar.Name))
|
|
|
|
|
throw new Exception(Resources.CalendarApiResource.ErrorEmptyName);
|
|
|
|
|
|
|
|
|
|
calendar.Description = (calendar.Description ?? "").Trim();
|
|
|
|
|
calendar.TextColor = (calendar.TextColor ?? "").Trim();
|
|
|
|
|
calendar.BackgroundColor = (calendar.BackgroundColor ?? "").Trim();
|
|
|
|
|
|
|
|
|
|
Guid calDavGuid = Guid.NewGuid();
|
|
|
|
|
|
|
|
|
|
var myUri = HttpContext.Request.GetUrlRewriter();
|
|
|
|
|
|
|
|
|
|
var _email = UserManager.GetUsers(AuthContext.CurrentAccount.ID).Email;
|
|
|
|
|
var currentUserName = _email.ToLower() + "@" + myUri.Host;
|
|
|
|
|
|
|
|
|
|
string currentAccountPaswd = Authentication.GetUserPasswordHash(TenantManager.GetCurrentTenant().TenantId, UserManager.GetUserByEmail(_email).ID);
|
|
|
|
|
|
|
|
|
|
//TODO caldav
|
|
|
|
|
|
|
|
|
|
/*var caldavTask = new Task(() => CreateCalDavCalendar(name, description, backgroundColor, calDavGuid.ToString(), myUri, currentUserName, _email, currentAccountPaswd));
|
|
|
|
|
caldavTask.Start();*/
|
|
|
|
|
|
|
|
|
|
var cal = DataProvider.CreateCalendar(
|
|
|
|
|
AuthContext.CurrentAccount.ID,
|
|
|
|
|
calendar.Name,
|
|
|
|
|
calendar.Description,
|
|
|
|
|
calendar.TextColor,
|
|
|
|
|
calendar.BackgroundColor,
|
|
|
|
|
timeZoneInfo,
|
|
|
|
|
calendar.AlertType,
|
|
|
|
|
null,
|
|
|
|
|
sharingOptionsList.Select(o => o as SharingOptions.PublicItem).ToList(),
|
|
|
|
|
new List<UserViewSettings>(),
|
|
|
|
|
calDavGuid,
|
|
|
|
|
calendar.IsTodo);
|
|
|
|
|
|
|
|
|
|
if (cal == null) throw new Exception("calendar is null");
|
|
|
|
|
|
|
|
|
|
foreach (var opt in sharingOptionsList)
|
|
|
|
|
if (String.Equals(opt.actionId, AccessOption.FullAccessOption.Id, StringComparison.InvariantCultureIgnoreCase))
|
|
|
|
|
AuthorizationManager.AddAce(new AzRecord(opt.Id, CalendarAccessRights.FullAccessAction.ID, Common.Security.Authorizing.AceType.Allow, cal));
|
|
|
|
|
|
|
|
|
|
//notify
|
|
|
|
|
//CalendarNotifyClient.NotifyAboutSharingCalendar(cal);
|
|
|
|
|
|
|
|
|
|
/*//iCalUrl
|
|
|
|
|
if (!string.IsNullOrEmpty(iCalUrl))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var req = (HttpWebRequest)WebRequest.Create(iCalUrl);
|
|
|
|
|
using (var resp = req.GetResponse())
|
|
|
|
|
using (var stream = resp.GetResponseStream())
|
|
|
|
|
{
|
|
|
|
|
var ms = new MemoryStream();
|
|
|
|
|
stream.StreamCopyTo(ms);
|
|
|
|
|
ms.Seek(0, SeekOrigin.Begin);
|
|
|
|
|
|
|
|
|
|
using (var tempReader = new StreamReader(ms))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
var cals = DDayICalParser.DeserializeCalendar(tempReader);
|
|
|
|
|
ImportEvents(Convert.ToInt32(cal.Id), cals);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
Logger.Info(String.Format("Error import events to new calendar by ical url: {0}", ex.Message));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
|
|
return CalendarWrapperHelper.Get(cal);
|
|
|
|
|
}
|
2020-02-12 07:58:31 +00:00
|
|
|
|
}
|
|
|
|
|
|
2020-02-21 12:33:51 +00:00
|
|
|
|
public static class CalendarControllerExtention
|
2020-02-12 07:58:31 +00:00
|
|
|
|
{
|
2020-02-27 14:15:25 +00:00
|
|
|
|
public static DIHelper AddCalendarController(this DIHelper services)
|
2020-02-12 07:58:31 +00:00
|
|
|
|
{
|
|
|
|
|
return services
|
2020-02-19 10:26:11 +00:00
|
|
|
|
.AddApiContextService()
|
|
|
|
|
.AddSecurityContextService()
|
2020-02-27 08:50:06 +00:00
|
|
|
|
.AddPermissionContextService()
|
|
|
|
|
.AddCommonLinkUtilityService()
|
|
|
|
|
.AddDisplayUserSettingsService()
|
2020-02-19 10:26:11 +00:00
|
|
|
|
.AddCalendarDbContextService()
|
2020-02-21 12:33:51 +00:00
|
|
|
|
.AddCalendarDataProviderService()
|
2020-02-27 08:50:06 +00:00
|
|
|
|
.AddCalendarWrapper();
|
2020-02-12 07:58:31 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|